From duraid at octopus.com.au Mon Jan 16 00:33:50 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Mon, 16 Jan 2006 00:33:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp IA64InstrInfo.td Message-ID: <200601160633.AAA08711@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.21 -> 1.22 IA64InstrInfo.td updated: 1.37 -> 1.38 --- Log message: fix division! again!! pattern isel, prepare to die. --- Diffs of the changes: (+118 -101) IA64ISelDAGToDAG.cpp | 198 ++++++++++++++++++++++++--------------------------- IA64InstrInfo.td | 21 +++++ 2 files changed, 118 insertions(+), 101 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.21 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.22 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.21 Sun Jan 15 03:45:22 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Mon Jan 16 00:33:38 2006 @@ -199,11 +199,13 @@ Chain = TmpF3.getValue(1); TmpF4 = CurDAG->getTargetNode(IA64::FCVTXF, MVT::f64, TmpF2); Chain = TmpF4.getValue(1); - } else { - TmpF3 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF1); - Chain = TmpF3.getValue(1); - TmpF4 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF2); - Chain = TmpF4.getValue(1); + } else { // is unsigned + if(isModulus) { /* unsigned integer divides do not need any fcvt.x*f* insns */ + TmpF3 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF1); + Chain = TmpF3.getValue(1); + TmpF4 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF2); + Chain = TmpF4.getValue(1); + } } } else { // this is an FP divide/remainder, so we 'leak' some temp @@ -214,116 +216,110 @@ // we start by computing an approximate reciprocal (good to 9 bits?) // note, this instruction writes _both_ TmpF5 (answer) and TmpPR (predicate) - TmpF5 = CurDAG->getTargetNode(IA64::FRCPAS1, MVT::f64, MVT::i1, + if(isFP) + TmpF5 = CurDAG->getTargetNode(IA64::FRCPAS0, MVT::f64, MVT::i1, TmpF3, TmpF4); + else + TmpF5 = CurDAG->getTargetNode(IA64::FRCPAS1, MVT::f64, MVT::i1, + TmpF3, TmpF4); + TmpPR = TmpF5.getValue(1); Chain = TmpF5.getValue(2); - if(!isModulus) { // if this is a divide, we worry about div-by-zero - SDOperand bogusPR = CurDAG->getTargetNode(IA64::CMPEQ, MVT::i1, - CurDAG->getRegister(IA64::r0, MVT::i64), - CurDAG->getRegister(IA64::r0, MVT::i64)); - Chain = bogusPR.getValue(1); - TmpPR2 = CurDAG->getTargetNode(IA64::TPCMPNE, MVT::i1, bogusPR, - CurDAG->getRegister(IA64::r0, MVT::i64), - CurDAG->getRegister(IA64::r0, MVT::i64), TmpPR); - Chain = TmpPR2.getValue(1); - } - + // we'll need copies of F0 and F1 SDOperand F0 = CurDAG->getRegister(IA64::F0, MVT::f64); SDOperand F1 = CurDAG->getRegister(IA64::F1, MVT::f64); - // now we apply newton's method, thrice! (FIXME: this is ~72 bits of - // precision, don't need this much for f32/i32) - TmpF6 = CurDAG->getTargetNode(IA64::CFNMAS1, MVT::f64, - TmpF4, TmpF5, F1, TmpPR); - Chain = TmpF6.getValue(1); - TmpF7 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF3, TmpF5, F0, TmpPR); - Chain = TmpF7.getValue(1); - TmpF8 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF6, TmpF6, F0, TmpPR); - Chain = TmpF8.getValue(1); - TmpF9 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF6, TmpF7, TmpF7, TmpPR); - Chain = TmpF9.getValue(1); - TmpF10 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF6, TmpF5, TmpF5, TmpPR); - Chain = TmpF10.getValue(1); - TmpF11 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF8, TmpF9, TmpF9, TmpPR); - Chain = TmpF11.getValue(1); - TmpF12 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF8, TmpF10, TmpF10, TmpPR); - Chain = TmpF12.getValue(1); - TmpF13 = CurDAG->getTargetNode(IA64::CFNMAS1, MVT::f64, - TmpF4, TmpF11, TmpF3, TmpPR); - Chain = TmpF13.getValue(1); + SDOperand minusB; + if(isModulus) { // for remainders, it'll be handy to have + // copies of -input_b + minusB = CurDAG->getTargetNode(IA64::SUB, MVT::i64, + CurDAG->getRegister(IA64::r0, MVT::i64), Tmp2); + Chain = minusB.getValue(1); + } - // FIXME: this is unfortunate :( - // the story is that the dest reg of the fnma above and the fma below - // (and therefore possibly the src of the fcvt.fx[u] as well) cannot - // be the same register, or this code breaks if the first argument is - // zero. (e.g. without this hack, 0%8 yields -64, not 0.) - TmpF14 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpF13, TmpF12, TmpF11, TmpPR); - Chain = TmpF14.getValue(1); + SDOperand TmpE0, TmpY1, TmpE1, TmpY2; - if(isModulus) { // XXX: fragile! fixes _only_ mod, *breaks* div! ! - SDOperand bogus = CurDAG->getTargetNode(IA64::IUSE, MVT::Other, TmpF13); // hack :( - Chain = bogus.getValue(0); // hmmm - } - - if(!isFP) { - // round to an integer - if(isSigned) { - TmpF15 = CurDAG->getTargetNode(IA64::FCVTFXTRUNCS1, MVT::i64, TmpF14); - Chain = TmpF15.getValue(1); - } - else { - TmpF15 = CurDAG->getTargetNode(IA64::FCVTFXUTRUNCS1, MVT::i64, TmpF14); - Chain = TmpF15.getValue(1); - } - } else { - TmpF15 = TmpF14; - // EXERCISE: can you see why TmpF15=TmpF14 does not work here, and - // we really do need the above FMOV? ;) - } - - if(!isModulus) { - if(isFP) { // extra worrying about div-by-zero - // we do a 'conditional fmov' (of the correct result, depending - // on how the frcpa predicate turned out) - SDOperand bogoResult = CurDAG->getTargetNode(IA64::PFMOV, MVT::f64, - TmpF12, TmpPR2); - Chain = bogoResult.getValue(1); - Result = CurDAG->getTargetNode(IA64::CFMOV, MVT::f64, bogoResult, - TmpF15, TmpPR); + TmpE0 = CurDAG->getTargetNode(IA64::CFNMAS1, MVT::f64, + TmpF4, TmpF5, F1, TmpPR); + Chain = TmpE0.getValue(1); + TmpY1 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpF5, TmpE0, TmpF5, TmpPR); + Chain = TmpY1.getValue(1); + TmpE1 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpE0, TmpE0, F0, TmpPR); + Chain = TmpE1.getValue(1); + TmpY2 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpY1, TmpE1, TmpY1, TmpPR); + Chain = TmpY2.getValue(1); + + if(isFP) { // if this is an FP divide, we finish up here and exit early + if(isModulus) + assert(0 && "Sorry, try another FORTRAN compiler."); + + SDOperand TmpE2, TmpY3, TmpQ0, TmpR0; + + TmpE2 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpE1, TmpE1, F0, TmpPR); + Chain = TmpE2.getValue(1); + TmpY3 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpY2, TmpE2, TmpY2, TmpPR); + Chain = TmpY3.getValue(1); + TmpQ0 = CurDAG->getTargetNode(IA64::CFMADS1, MVT::f64, // double prec! + Tmp1, TmpY3, F0, TmpPR); + Chain = TmpQ0.getValue(1); + TmpR0 = CurDAG->getTargetNode(IA64::CFNMADS1, MVT::f64, // double prec! + Tmp2, TmpQ0, Tmp1, TmpPR); + Chain = TmpR0.getValue(1); + +// we want Result to have the same target register as the frcpa, so +// we two-address hack it. See the comment "for this to work..." on +// page 48 of Intel application note #245415 + Result = CurDAG->getTargetNode(IA64::TCFMADS0, MVT::f64, // d.p. s0 rndg! + TmpY3, TmpR0, TmpQ0, TmpPR); Chain = Result.getValue(1); - } - else { - Result = CurDAG->getTargetNode(IA64::GETFSIG, MVT::i64, TmpF15); + return Result; // XXX: early exit! + } else { // this is *not* an FP divide, so there's a bit left to do: + + SDOperand TmpQ2, TmpR2, TmpQ3, TmpQ; + + TmpQ2 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpF3, TmpY2, F0, TmpPR); + Chain = TmpQ2.getValue(1); + TmpR2 = CurDAG->getTargetNode(IA64::CFNMAS1, MVT::f64, + TmpF4, TmpQ2, TmpF3, TmpPR); + Chain = TmpR2.getValue(1); + +// we want TmpQ3 to have the same target register as the frcpa, so +// we two-address hack it. See the comment "for this to work..." on +// page 48 of Intel application note #245415 + TmpQ3 = CurDAG->getTargetNode(IA64::TCFMAS1, MVT::f64, + TmpR2, TmpR2, TmpY2, TmpQ2, TmpPR); + Chain = TmpQ3.getValue(1); + + if(isSigned) + TmpQ = CurDAG->getTargetNode(IA64::FCVTFXTRUNCS1, MVT::f64, TmpQ3); + else + TmpQ = CurDAG->getTargetNode(IA64::FCVTFXUTRUNCS1, MVT::f64, TmpQ3); + + Chain = TmpQ.getValue(1); + + if(isModulus) { + SDOperand FPminusB = CurDAG->getTargetNode(IA64::SETFSIG, MVT::f64, + minusB); + Chain = FPminusB.getValue(1); + SDOperand Remainder = CurDAG->getTargetNode(IA64::XMAL, MVT::f64, + TmpQ, FPminusB, TmpF1); + Chain = Remainder.getValue(1); + Result = CurDAG->getTargetNode(IA64::GETFSIG, MVT::i64, Remainder); Chain = Result.getValue(1); - } - } else { // this is a modulus - if(!isFP) { - // answer = q * (-b) + a - SDOperand TmpI = CurDAG->getTargetNode(IA64::SUB, MVT::i64, - CurDAG->getRegister(IA64::r0, MVT::i64), Tmp2); - Chain = TmpI.getValue(1); - SDOperand TmpF = CurDAG->getTargetNode(IA64::SETFSIG, MVT::f64, TmpI); - Chain = TmpF.getValue(1); - SDOperand ModulusResult = CurDAG->getTargetNode(IA64::XMAL, MVT::f64, - TmpF15, TmpF, TmpF1); - Chain = ModulusResult.getValue(1); - Result = CurDAG->getTargetNode(IA64::GETFSIG, MVT::i64, ModulusResult); + } else { // just an integer divide + Result = CurDAG->getTargetNode(IA64::GETFSIG, MVT::i64, TmpQ); Chain = Result.getValue(1); - } else { // FP modulus! The horror... the horror.... - assert(0 && "sorry, no FP modulus just yet!\n!\n"); } - } - return Result; + return Result; + } // wasn't an FP divide } // Select - Convert the specified operand from a target-independent to a Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.37 llvm/lib/Target/IA64/IA64InstrInfo.td:1.38 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.37 Tue Jan 10 19:38:07 2006 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Mon Jan 16 00:33:38 2006 @@ -589,6 +589,15 @@ "fnegabs $dst = $src;;", [(set FP:$dst, (fneg (fabs FP:$src)))]>; +let isTwoAddress=1 in { +def TCFMAS1 : AForm<0x03, 0x0b, + (ops FP:$dst, FP:$bogussrc, FP:$src1, FP:$src2, FP:$src3, PR:$qp), + "($qp) fma.s1 $dst = $src1, $src2, $src3;;">; +def TCFMADS0 : AForm<0x03, 0x0b, + (ops FP:$dst, FP:$bogussrc, FP:$src1, FP:$src2, FP:$src3, PR:$qp), + "($qp) fma.d.s0 $dst = $src1, $src2, $src3;;">; +} + def CFMAS1 : AForm<0x03, 0x0b, (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp), "($qp) fma.s1 $dst = $src1, $src2, $src3;;">; @@ -596,6 +605,18 @@ (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp), "($qp) fnma.s1 $dst = $src1, $src2, $src3;;">; +def CFMADS1 : AForm<0x03, 0x0b, + (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp), + "($qp) fma.d.s1 $dst = $src1, $src2, $src3;;">; +def CFMADS0 : AForm<0x03, 0x0b, + (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp), + "($qp) fma.d.s0 $dst = $src1, $src2, $src3;;">; +def CFNMADS1 : AForm<0x03, 0x0b, + (ops FP:$dst, FP:$src1, FP:$src2, FP:$src3, PR:$qp), + "($qp) fnma.d.s1 $dst = $src1, $src2, $src3;;">; + +def FRCPAS0 : AForm<0x03, 0x0b, (ops FP:$dstFR, PR:$dstPR, FP:$src1, FP:$src2), + "frcpa.s0 $dstFR, $dstPR = $src1, $src2;;">; def FRCPAS1 : AForm<0x03, 0x0b, (ops FP:$dstFR, PR:$dstPR, FP:$src1, FP:$src2), "frcpa.s1 $dstFR, $dstPR = $src1, $src2;;">; From natebegeman at mac.com Mon Jan 16 01:54:35 2006 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 16 Jan 2006 01:54:35 -0600 Subject: [llvm-commits] CVS: llvm/docs/ExtendingLLVM.html Message-ID: <200601160754.BAA09098@zion.cs.uiuc.edu> Changes in directory llvm/docs: ExtendingLLVM.html updated: 1.20 -> 1.21 --- Log message: Fix up 'adding an intrinsic' section a bit, first draft of 'adding a new sdnode' section. --- Diffs of the changes: (+116 -41) ExtendingLLVM.html | 157 +++++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 116 insertions(+), 41 deletions(-) Index: llvm/docs/ExtendingLLVM.html diff -u llvm/docs/ExtendingLLVM.html:1.20 llvm/docs/ExtendingLLVM.html:1.21 --- llvm/docs/ExtendingLLVM.html:1.20 Fri Jan 13 19:27:10 2006 +++ llvm/docs/ExtendingLLVM.html Mon Jan 16 01:54:23 2006 @@ -16,6 +16,7 @@
  • Introduction and Warning
  • Adding a new intrinsic function
  • Adding a new instruction
  • +
  • Adding a new SelectionDAG node
  • Adding a new type
    1. Adding a new fundamental type
    2. @@ -105,9 +106,8 @@ effects, add it to the list of intrinsics in the isInstructionTriviallyDead function. -
    3. Test your intrinsic
    4. - -
    5. llvm/test/Regression/*: add your test cases to the test suite
    6. +
    7. llvm/test/Regression/*: Add test cases for your test cases to the + test suite

    Once the intrinsic has been added to the system, you must add code generator @@ -116,48 +116,123 @@

    Add support to the C backend in lib/Target/CBackend/
    -
    Depending on the intrinsic, there are a few ways to implement this. First, -if it makes sense to lower the intrinsic to an expanded sequence of C code in -all cases, just emit the expansion in visitCallInst. Second, if the -intrinsic has some way to express it with GCC (or any other compiler) -extensions, it can be conditionally supported based on the compiler compiling -the CBE output (see llvm.prefetch for an example). Third, if the intrinsic -really has no way to be lowered, just have the code generator emit code that -prints an error message and calls abort if executed. +
    Depending on the intrinsic, there are a few ways to implement this. For +most intrinsics, it makes sense to add code to lower your intrinsic in +LowerIntrinsicCall in lib/CodeGen/IntrinsicLowering.cpp. +Second, if it makes sense to lower the intrinsic to an expanded sequence of C +code in all cases, just emit the expansion in visitCallInst in +Writer.cpp. If the intrinsic has some way to express it with GCC +(or any other compiler) extensions, it can be conditionally supported based on +the compiler compiling the CBE output (see llvm.prefetch for an example). +Third, if the intrinsic really has no way to be lowered, just have the code +generator emit code that prints an error message and calls abort if executed.
    -
    Add a enum value for the SelectionDAG node in -include/llvm/CodeGen/SelectionDAGNodes.h
    +
    +
    Add support to the SelectionDAG Instruction Selector in +lib/CodeGen/SelectionDAG/
    + +
    Since most targets in LLVM use the SelectionDAG framework for generating +code, you will likely need to add support for your intrinsic there as well. +This is usually accomplished by adding a new node, and then teaching the +SelectionDAG code how to handle that node. To do this, follow the steps in +the next section, Adding a new SelectionDAG node.
    -
    Also, add code to lib/CodeGen/SelectionDAG/SelectionDAG.cpp (and -SelectionDAGPrinter.cpp) to print the node.
    +
    +
    Once you have added the new node, add code to +SelectionDAG/SelectionDAGISel.cpp to recognize the intrinsic. In most +cases, the intrinsic will just be turned into the node you just added. For an +example of this, see how visitIntrinsicCall handles Intrinsic::ctpop +
    -
    Add code to SelectionDAG/SelectionDAGISel.cpp to recognize the -intrinsic.
    + -
    Presumably the intrinsic should be recognized and turned into the node you -added above.
    - -
    Add code to SelectionDAG/LegalizeDAG.cpp to legalize, promote, and -expand the node as necessary.
    - -
    If the intrinsic can be expanded to primitive operations, legalize can break -the node down into other elementary operations that are be supported.
    - -
    Add target-specific support to specific code generators.
    - -
    Extend the code generators you are interested in to recognize and support -the node, emitting the code you want.
    -
    - -

    -Unfortunately, the process of extending the code generator to support a new node -is not extremely well documented. As such, it is often helpful to look at other -intrinsics (e.g. llvm.ctpop) to see how they are recognized and turned -into a node by SelectionDAGISel.cpp, legalized by -LegalizeDAG.cpp, then finally emitted by the various code generators. -

    + + + + +
    + +

    As with intrinsics, adding a new SelectionDAG node to LLVM is much easier +than adding a new instruction. New nodes are often added to help represent +instructions common to many targets. These nodes often map to an LLVM +instruction (add, sub) or intrinsic (byteswap, population count). In other +cases, new nodes have been added to allow many targets to perform a common task +(converting between floating point and integer representation) or capture more +complicated behavior in a single node (rotate).

    + +
      +
    1. include/llvm/CodeGen/SelectionDAGNodes.h: + Add an enum value for the new SelectionDAG node.
    2. +
    3. lib/CodeGen/SelectionDAG/SelectionDAG.cpp: + Add code to print the node to getOperationName. If your new node + can be evaluated at compile time when given constant arguments (such as an + add of a constant with another constant), find the getNode method + that takes the appropriate number of arguments, and add a case for your node + to the switch statement that performs constant folding for nodes that take + the same number of arguments as your new node.
    4. +
    5. lib/CodeGen/SelectionDAG/LegalizeDAG.cpp: + Add code to legalize, + promote, and expand the node as necessary. At a minimum, you will need + to add a case statement for your node in LegalizeOp which calls + LegalizeOp on the node's operands, and returns a new node if any of the + operands changed as a result of being legalized. It is likely that not all + targets supported by the SelectionDAG framework will natively support the + new node. In this case, you must also add code in your node's case + statement in LegalizeOp to Expand your node into simpler, legal + operations. The case for ISD::UREM for expanding a remainder into a + multiply and a subtract is a good example.
    6. +
    7. lib/CodeGen/SelectionDAG/LegalizeDAG.cpp: + If targets may support the new node being added only at certain sizes, you + will also need to add code to your node's case statement in + LegalizeOp to Promote your node's operands to a larger size, and + perform the correct operation. You will also need to add code to + PromoteOp to do this as well. For a good example, see ISD::BSWAP, + which promotes its operand to a wider size, performs the byteswap, and then + shifts the correct bytes right to emulate the narrower byteswap in the + wider type.
    8. +
    9. lib/CodeGen/SelectionDAG/LegalizeDAG.cpp: + Add a case for your node in ExpandOp to teach the legalizer how to + perform the action represented by the new node on a value that has been + split into high and low halves. This case will be used to support your + node with a 64 bit operand on a 32 bit target.
    10. +
    11. lib/CodeGen/SelectionDAG/DAGCombiner.cpp: + If your node can be combined with itself, or other existing nodes in a + peephole-like fashion, add a visit function for it, and call that function + from . There are several good examples for simple combines you + can do; visitFABS and visitSRL are good starting places. +
    12. +
    13. lib/Target/PowerPC/PPCISelLowering.cpp: + Each target has an implementation of the TargetLowering class, + usually in its own file (although some targets include it in the same + file as the DAGToDAGISel). The default behavior for a target is to + assume that your new node is legal for all types that are legal for + that target. If this target does not natively support your node, then + tell the target to either Promote it (if it is supported at a larger + type) or Expand it. This will cause the code you wrote in + LegalizeOp above to decompose your new node into other legal + nodes for this target.
    14. +
    15. lib/Target/TargetSelectionDAG.td: + Most current targets supported by LLVM generate code using the DAGToDAG + method, where SelectionDAG nodes are pattern matched to target-specific + nodes, which represent individual instructions. In order for the targets + to match an instruction to your new node, you must add a def for that node + to the list in this file, with the appropriate type constraints. Look at + add, bswap, and fadd for examples.
    16. +
    17. lib/Target/PowerPC/PPCInstrInfo.td: + Each target has a tablegen file that describes the target's instruction + set. For targets that use the DAGToDAG instruction selection framework, + add a pattern for your new node that uses one or more target nodes. + Documentation for this is a bit sparse right now, but there are several + decent examples. See the patterns for rotl in + PPCInstrInfo.td.
    18. +
    19. TODO: document complex patterns.
    20. +
    21. llvm/test/Regression/CodeGen/*: Add test cases for your new node + to the test suite. llvm/test/Regression/CodeGen/X86/bswap.ll is + a good example.
    22. +
    @@ -326,7 +401,7 @@ The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/01/14 01:27:10 $ + Last modified: $Date: 2006/01/16 07:54:23 $ From natebegeman at mac.com Mon Jan 16 01:57:11 2006 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 16 Jan 2006 01:57:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/IntrinsicLowering.cpp Message-ID: <200601160757.BAA09118@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: IntrinsicLowering.cpp updated: 1.37 -> 1.38 --- Log message: Add BSWAP stuff to intrinsic lowering for CBE & friends. --- Diffs of the changes: (+106 -2) IntrinsicLowering.cpp | 108 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 106 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/IntrinsicLowering.cpp diff -u llvm/lib/CodeGen/IntrinsicLowering.cpp:1.37 llvm/lib/CodeGen/IntrinsicLowering.cpp:1.38 --- llvm/lib/CodeGen/IntrinsicLowering.cpp:1.37 Thu Jan 12 20:22:08 2006 +++ llvm/lib/CodeGen/IntrinsicLowering.cpp Mon Jan 16 01:57:00 2006 @@ -128,8 +128,102 @@ } } +/// LowerBSWAP - Emit the code to lower bswap of V before the specified +/// instruction IP. +static Value *LowerBSWAP(Value *V, Instruction *IP) { + assert(V->getType()->isInteger() && "Can't bswap a non-integer type!"); + + const Type *DestTy = V->getType(); + + // Force to unsigned so that the shift rights are logical. + if (DestTy->isSigned()) + V = new CastInst(V, DestTy->getUnsignedVersion(), V->getName(), IP); + + unsigned BitSize = V->getType()->getPrimitiveSizeInBits(); + + switch(BitSize) { + default: assert(0 && "Unhandled type size of value to byteswap!"); + case 16: { + Value *Tmp1 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,8),"bswap.2",IP); + Value *Tmp2 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,8),"bswap.1",IP); + V = BinaryOperator::createOr(Tmp1, Tmp2, "bswap.i16", IP); + break; + } + case 32: { + Value *Tmp4 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,24),"bswap.4", IP); + Value *Tmp3 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,8),"bswap.3",IP); + Value *Tmp2 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,8),"bswap.2",IP); + Value *Tmp1 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,24),"bswap.1", IP); + Tmp3 = BinaryOperator::createAnd(Tmp3, + ConstantUInt::get(Type::UIntTy, 0xFF0000), + "bswap.and3", IP); + Tmp2 = BinaryOperator::createAnd(Tmp2, + ConstantUInt::get(Type::UIntTy, 0xFF00), + "bswap.and2", IP); + Tmp4 = BinaryOperator::createOr(Tmp4, Tmp3, "bswap.or1", IP); + Tmp2 = BinaryOperator::createOr(Tmp2, Tmp1, "bswap.or2", IP); + V = BinaryOperator::createOr(Tmp4, Tmp3, "bswap.i32", IP); + break; + } + case 64: { + Value *Tmp8 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,56),"bswap.8", IP); + Value *Tmp7 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,40),"bswap.7", IP); + Value *Tmp6 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,24),"bswap.6", IP); + Value *Tmp5 = new ShiftInst(Instruction::Shl, V, + ConstantInt::get(Type::UByteTy,8),"bswap.5",IP); + Value *Tmp4 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,8),"bswap.4",IP); + Value *Tmp3 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,24),"bswap.3", IP); + Value *Tmp2 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,40),"bswap.2", IP); + Value *Tmp1 = new ShiftInst(Instruction::Shr, V, + ConstantInt::get(Type::UByteTy,56),"bswap.1", IP); + Tmp7 = BinaryOperator::createAnd(Tmp7, + ConstantUInt::get(Type::ULongTy, 0xFF000000000000ULL), + "bswap.and7", IP); + Tmp6 = BinaryOperator::createAnd(Tmp6, + ConstantUInt::get(Type::ULongTy, 0xFF0000000000ULL), + "bswap.and6", IP); + Tmp5 = BinaryOperator::createAnd(Tmp5, + ConstantUInt::get(Type::ULongTy, 0xFF00000000ULL), + "bswap.and5", IP); + Tmp4 = BinaryOperator::createAnd(Tmp4, + ConstantUInt::get(Type::ULongTy, 0xFF000000ULL), + "bswap.and4", IP); + Tmp3 = BinaryOperator::createAnd(Tmp3, + ConstantUInt::get(Type::ULongTy, 0xFF0000ULL), + "bswap.and3", IP); + Tmp2 = BinaryOperator::createAnd(Tmp2, + ConstantUInt::get(Type::ULongTy, 0xFF00ULL), + "bswap.and2", IP); + Tmp8 = BinaryOperator::createOr(Tmp8, Tmp7, "bswap.or1", IP); + Tmp6 = BinaryOperator::createOr(Tmp6, Tmp5, "bswap.or2", IP); + Tmp4 = BinaryOperator::createOr(Tmp4, Tmp3, "bswap.or3", IP); + Tmp2 = BinaryOperator::createOr(Tmp2, Tmp1, "bswap.or4", IP); + Tmp8 = BinaryOperator::createOr(Tmp8, Tmp6, "bswap.or5", IP); + Tmp4 = BinaryOperator::createOr(Tmp4, Tmp2, "bswap.or6", IP); + V = BinaryOperator::createOr(Tmp8, Tmp4, "bswap.i64", IP); + break; + } + } + + if (V->getType() != DestTy) + V = new CastInst(V, DestTy, V->getName(), IP); + return V; +} + /// LowerCTPOP - Emit the code to lower ctpop of V before the specified -/// instruction. +/// instruction IP. static Value *LowerCTPOP(Value *V, Instruction *IP) { assert(V->getType()->isInteger() && "Can't ctpop a non-integer type!"); @@ -163,7 +257,7 @@ } /// LowerCTLZ - Emit the code to lower ctlz of V before the specified -/// instruction. +/// instruction IP. static Value *LowerCTLZ(Value *V, Instruction *IP) { const Type *DestTy = V->getType(); @@ -185,6 +279,8 @@ return LowerCTPOP(V, IP); } + + void DefaultIntrinsicLowering::LowerIntrinsicCall(CallInst *CI) { Function *Callee = CI->getCalledFunction(); assert(Callee && "Cannot lower an indirect call!"); @@ -230,6 +326,13 @@ AbortFCache); break; } + + case Intrinsic::bswap_i16: + case Intrinsic::bswap_i32: + case Intrinsic::bswap_i64: + CI->replaceAllUsesWith(LowerBSWAP(CI->getOperand(1), CI)); + break; + case Intrinsic::ctpop: CI->replaceAllUsesWith(LowerCTPOP(CI->getOperand(1), CI)); break; @@ -237,6 +340,7 @@ case Intrinsic::ctlz: CI->replaceAllUsesWith(LowerCTLZ(CI->getOperand(1), CI)); break; + case Intrinsic::cttz: { // cttz(x) -> ctpop(~X & (X-1)) Value *Src = CI->getOperand(1); From natebegeman at mac.com Mon Jan 16 01:59:24 2006 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 16 Jan 2006 01:59:24 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601160759.BAA09130@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.266 -> 1.267 --- Log message: Expand case for 64b Legalize, even though no one should end up using this (itanium supports bswap natively, alpha should custom lower it using the VAX floating point swapload, ha ha). --- Diffs of the changes: (+43 -4) LegalizeDAG.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 43 insertions(+), 4 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.266 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.267 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.266 Sun Jan 15 02:54:32 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Mon Jan 16 01:59:13 2006 @@ -2179,12 +2179,12 @@ Tmp2 = LegalizeOp(Node->getOperand(1)); // RHS switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) { case TargetLowering::Custom: { - Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1, Tmp2); + Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2); SDOperand Tmp = TLI.LowerOperation(Result, DAG); if (Tmp.Val) { - Tmp = LegalizeOp(Tmp); // Relegalize input. - AddLegalizedOperand(Op, Tmp); - return Tmp; + Tmp = LegalizeOp(Tmp); // Relegalize input. + AddLegalizedOperand(Op, Tmp); + return Tmp; } //else it was considered legal and we fall through } case TargetLowering::Legal: @@ -2276,6 +2276,45 @@ Tmp2 = DAG.getNode(ISD::OR, VT, Tmp2, Tmp1); Result = DAG.getNode(ISD::OR, VT, Tmp4, Tmp2); break; + case MVT::i64: { + SDOperand Tmp5, Tmp6, Tmp7, Tmp8; + Tmp8 = DAG.getNode(ISD::SHL, VT, Tmp1, + DAG.getConstant(56, TLI.getShiftAmountTy())); + Tmp7 = DAG.getNode(ISD::SHL, VT, Tmp1, + DAG.getConstant(40, TLI.getShiftAmountTy())); + Tmp6 = DAG.getNode(ISD::SHL, VT, Tmp1, + DAG.getConstant(24, TLI.getShiftAmountTy())); + Tmp5 = DAG.getNode(ISD::SHL, VT, Tmp1, + DAG.getConstant(8, TLI.getShiftAmountTy())); + Tmp4 = DAG.getNode(ISD::SRL, VT, Tmp1, + DAG.getConstant(8, TLI.getShiftAmountTy())); + Tmp3 = DAG.getNode(ISD::SRL, VT, Tmp1, + DAG.getConstant(24, TLI.getShiftAmountTy())); + Tmp2 = DAG.getNode(ISD::SRL, VT, Tmp1, + DAG.getConstant(40, TLI.getShiftAmountTy())); + Tmp1 = DAG.getNode(ISD::SRL, VT, Tmp1, + DAG.getConstant(56, TLI.getShiftAmountTy())); + Tmp7 = DAG.getNode(ISD::AND, VT, Tmp7, + DAG.getConstant(0x00FF000000000000ULL, VT)); + Tmp6 = DAG.getNode(ISD::AND, VT, Tmp7, + DAG.getConstant(0x0000FF0000000000ULL, VT)); + Tmp5 = DAG.getNode(ISD::AND, VT, Tmp7, + DAG.getConstant(0x000000FF00000000ULL, VT)); + Tmp4 = DAG.getNode(ISD::AND, VT, Tmp7, + DAG.getConstant(0x00000000FF000000ULL, VT)); + Tmp3 = DAG.getNode(ISD::AND, VT, Tmp7, + DAG.getConstant(0x0000000000FF0000ULL, VT)); + Tmp2 = DAG.getNode(ISD::AND, VT, Tmp7, + DAG.getConstant(0x000000000000FF00ULL, VT)); + Tmp8 = DAG.getNode(ISD::OR, VT, Tmp8, Tmp7); + Tmp6 = DAG.getNode(ISD::OR, VT, Tmp6, Tmp5); + Tmp4 = DAG.getNode(ISD::OR, VT, Tmp4, Tmp3); + Tmp2 = DAG.getNode(ISD::OR, VT, Tmp2, Tmp1); + Tmp8 = DAG.getNode(ISD::OR, VT, Tmp8, Tmp6); + Tmp4 = DAG.getNode(ISD::OR, VT, Tmp4, Tmp2); + Result = DAG.getNode(ISD::OR, VT, Tmp8, Tmp4); + break; + } } break; } From natebegeman at mac.com Mon Jan 16 02:07:22 2006 From: natebegeman at mac.com (Nate Begeman) Date: Mon, 16 Jan 2006 02:07:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Message-ID: <200601160807.CAA09637@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAG.cpp updated: 1.239 -> 1.240 --- Log message: Constant fold ctpop/ctlz/cttz, and a couple other small cleanups --- Diffs of the changes: (+58 -2) SelectionDAG.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 58 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.239 llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.240 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp:1.239 Sun Jan 15 02:39:35 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp Mon Jan 16 02:07:10 2006 @@ -32,6 +32,8 @@ switch (Opcode) { case ISD::ADD: case ISD::MUL: + case ISD::MULHU: + case ISD::MULHS: case ISD::FADD: case ISD::FMUL: case ISD::AND: @@ -828,6 +830,7 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT, SDOperand Operand) { + unsigned Tmp1; // Constant fold unary operations with an integer constant operand. if (ConstantSDNode *C = dyn_cast(Operand.Val)) { uint64_t Val = C->getValue(); @@ -848,6 +851,59 @@ return getConstantFP(BitsToDouble(Val), VT); } break; + case ISD::BSWAP: + switch(VT) { + default: assert(0 && "Invalid bswap!"); break; + case MVT::i16: return getConstant(ByteSwap_16((unsigned short)Val), VT); + case MVT::i32: return getConstant(ByteSwap_32((unsigned)Val), VT); + case MVT::i64: return getConstant(ByteSwap_64(Val), VT); + } + break; + case ISD::CTPOP: + switch(VT) { + default: assert(0 && "Invalid ctpop!"); break; + case MVT::i1: return getConstant(Val != 0, VT); + case MVT::i8: + Tmp1 = (unsigned)Val & 0xFF; + return getConstant(CountPopulation_32(Tmp1), VT); + case MVT::i16: + Tmp1 = (unsigned)Val & 0xFFFF; + return getConstant(CountPopulation_32(Tmp1), VT); + case MVT::i32: + return getConstant(CountPopulation_32((unsigned)Val), VT); + case MVT::i64: + return getConstant(CountPopulation_64(Val), VT); + } + case ISD::CTLZ: + switch(VT) { + default: assert(0 && "Invalid ctlz!"); break; + case MVT::i1: return getConstant(Val == 0, VT); + case MVT::i8: + Tmp1 = (unsigned)Val & 0xFF; + return getConstant(CountLeadingZeros_32(Tmp1)-24, VT); + case MVT::i16: + Tmp1 = (unsigned)Val & 0xFFFF; + return getConstant(CountLeadingZeros_32(Tmp1)-16, VT); + case MVT::i32: + return getConstant(CountLeadingZeros_32((unsigned)Val), VT); + case MVT::i64: + return getConstant(CountLeadingZeros_64(Val), VT); + } + case ISD::CTTZ: + switch(VT) { + default: assert(0 && "Invalid cttz!"); break; + case MVT::i1: return getConstant(Val == 0, VT); + case MVT::i8: + Tmp1 = (unsigned)Val | 0x100; + return getConstant(CountTrailingZeros_32(Tmp1), VT); + case MVT::i16: + Tmp1 = (unsigned)Val | 0x10000; + return getConstant(CountTrailingZeros_32(Tmp1), VT); + case MVT::i32: + return getConstant(CountTrailingZeros_32((unsigned)Val), VT); + case MVT::i64: + return getConstant(CountTrailingZeros_64(Val), VT); + } } } @@ -1926,7 +1982,6 @@ case ISD::SRL: return "srl"; case ISD::ROTL: return "rotl"; case ISD::ROTR: return "rotr"; - case ISD::BSWAP: return "bswap"; case ISD::FADD: return "fadd"; case ISD::FSUB: return "fsub"; case ISD::FMUL: return "fmul"; @@ -1993,7 +2048,8 @@ case ISD::MEMCPY: return "memcpy"; case ISD::MEMMOVE: return "memmove"; - // Bit counting + // Bit manipulation + case ISD::BSWAP: return "bswap"; case ISD::CTPOP: return "ctpop"; case ISD::CTTZ: return "cttz"; case ISD::CTLZ: return "ctlz"; From duraid at octopus.com.au Mon Jan 16 08:33:25 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Mon, 16 Jan 2006 08:33:25 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Message-ID: <200601161433.IAA19024@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.22 -> 1.23 --- Log message: fixing divides: FP should now be 100%, and integers are fine too unless you try to div/mod 0 by anything, in which case you will get some cute number, and not 0, which is bad. --- Diffs of the changes: (+24 -17) IA64ISelDAGToDAG.cpp | 41 ++++++++++++++++++++++++----------------- 1 files changed, 24 insertions(+), 17 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.22 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.23 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.22 Mon Jan 16 00:33:38 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Mon Jan 16 08:33:04 2006 @@ -183,6 +183,10 @@ SDOperand TmpF1, TmpF2, TmpF3, TmpF4, TmpF5, TmpF6, TmpF7, TmpF8; SDOperand TmpF9, TmpF10,TmpF11,TmpF12,TmpF13,TmpF14,TmpF15; SDOperand Result; + + // we'll need copies of F0 and F1 + SDOperand F0 = CurDAG->getRegister(IA64::F0, MVT::f64); + SDOperand F1 = CurDAG->getRegister(IA64::F1, MVT::f64); // OK, emit some code: @@ -200,12 +204,10 @@ TmpF4 = CurDAG->getTargetNode(IA64::FCVTXF, MVT::f64, TmpF2); Chain = TmpF4.getValue(1); } else { // is unsigned - if(isModulus) { /* unsigned integer divides do not need any fcvt.x*f* insns */ - TmpF3 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF1); - Chain = TmpF3.getValue(1); - TmpF4 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF2); - Chain = TmpF4.getValue(1); - } + TmpF3 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF1); + Chain = TmpF3.getValue(1); + TmpF4 = CurDAG->getTargetNode(IA64::FCVTXUFS1, MVT::f64, TmpF2); + Chain = TmpF4.getValue(1); } } else { // this is an FP divide/remainder, so we 'leak' some temp @@ -226,10 +228,6 @@ TmpPR = TmpF5.getValue(1); Chain = TmpF5.getValue(2); - // we'll need copies of F0 and F1 - SDOperand F0 = CurDAG->getRegister(IA64::F0, MVT::f64); - SDOperand F1 = CurDAG->getRegister(IA64::F1, MVT::f64); - SDOperand minusB; if(isModulus) { // for remainders, it'll be handy to have // copies of -input_b @@ -276,7 +274,7 @@ // we two-address hack it. See the comment "for this to work..." on // page 48 of Intel application note #245415 Result = CurDAG->getTargetNode(IA64::TCFMADS0, MVT::f64, // d.p. s0 rndg! - TmpY3, TmpR0, TmpQ0, TmpPR); + TmpF5, TmpY3, TmpR0, TmpQ0, TmpPR); Chain = Result.getValue(1); return Result; // XXX: early exit! } else { // this is *not* an FP divide, so there's a bit left to do: @@ -290,13 +288,22 @@ TmpF4, TmpQ2, TmpF3, TmpPR); Chain = TmpR2.getValue(1); -// we want TmpQ3 to have the same target register as the frcpa, so -// we two-address hack it. See the comment "for this to work..." on -// page 48 of Intel application note #245415 - TmpQ3 = CurDAG->getTargetNode(IA64::TCFMAS1, MVT::f64, - TmpR2, TmpR2, TmpY2, TmpQ2, TmpPR); +// we want TmpQ3 to have the same target register as the frcpa? maybe we +// should two-address hack it. See the comment "for this to work..." on page +// 48 of Intel application note #245415 + TmpQ3 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, + TmpR2, TmpY2, TmpQ2, TmpPR); Chain = TmpQ3.getValue(1); - + + // FIXME: this is unfortunate :( + // the story is that the dest reg of the fnma above and the fma below it + // (and therefore the src of the fcvt.fx[u] below as well) cannot + // be the same register, or this code breaks if the first argument is + // zero. (e.g. without this hack, 0%8 yields -64, not 0.) +/* XXX: these two lines do nothing */ + SDOperand bogus = CurDAG->getTargetNode(IA64::IUSE, MVT::Other, TmpR2); + Chain = bogus.getValue(0); + if(isSigned) TmpQ = CurDAG->getTargetNode(IA64::FCVTFXTRUNCS1, MVT::f64, TmpQ3); else From lattner at cs.uiuc.edu Mon Jan 16 10:31:52 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 10:31:52 -0600 Subject: [llvm-commits] CVS: llvm/docs/ExtendingLLVM.html Message-ID: <200601161631.KAA19624@zion.cs.uiuc.edu> Changes in directory llvm/docs: ExtendingLLVM.html updated: 1.21 -> 1.22 --- Log message: Add a couple very minor tweaks --- Diffs of the changes: (+12 -8) ExtendingLLVM.html | 20 ++++++++++++-------- 1 files changed, 12 insertions(+), 8 deletions(-) Index: llvm/docs/ExtendingLLVM.html diff -u llvm/docs/ExtendingLLVM.html:1.21 llvm/docs/ExtendingLLVM.html:1.22 --- llvm/docs/ExtendingLLVM.html:1.21 Mon Jan 16 01:54:23 2006 +++ llvm/docs/ExtendingLLVM.html Mon Jan 16 10:31:40 2006 @@ -26,7 +26,8 @@

    Written by Misha Brukman, - Brad Jones, and Chris Lattner

    + Brad Jones, Nate Begeman, + and Chris Lattner

    @@ -123,7 +124,8 @@ code in all cases, just emit the expansion in visitCallInst in Writer.cpp. If the intrinsic has some way to express it with GCC (or any other compiler) extensions, it can be conditionally supported based on -the compiler compiling the CBE output (see llvm.prefetch for an example). +the compiler compiling the CBE output (see llvm.prefetch for an +example). Third, if the intrinsic really has no way to be lowered, just have the code generator emit code that prints an error message and calls abort if executed. @@ -136,13 +138,14 @@ code, you will likely need to add support for your intrinsic there as well. This is usually accomplished by adding a new node, and then teaching the SelectionDAG code how to handle that node. To do this, follow the steps in -the next section, Adding a new SelectionDAG node. +the Adding a new SelectionDAG node section.
    Once you have added the new node, add code to SelectionDAG/SelectionDAGISel.cpp to recognize the intrinsic. In most cases, the intrinsic will just be turned into the node you just added. For an -example of this, see how visitIntrinsicCall handles Intrinsic::ctpop +example of this, see how visitIntrinsicCall handles +Intrinsic::ctpop_*.
    @@ -182,14 +185,15 @@ targets supported by the SelectionDAG framework will natively support the new node. In this case, you must also add code in your node's case statement in LegalizeOp to Expand your node into simpler, legal - operations. The case for ISD::UREM for expanding a remainder into a - multiply and a subtract is a good example.
  • + operations. The case for ISD::UREM for expanding a remainder into + a divide, multiply, and a subtract is a good example.
  • lib/CodeGen/SelectionDAG/LegalizeDAG.cpp: If targets may support the new node being added only at certain sizes, you will also need to add code to your node's case statement in LegalizeOp to Promote your node's operands to a larger size, and perform the correct operation. You will also need to add code to - PromoteOp to do this as well. For a good example, see ISD::BSWAP, + PromoteOp to do this as well. For a good example, see + ISD::BSWAP, which promotes its operand to a wider size, performs the byteswap, and then shifts the correct bytes right to emulate the narrower byteswap in the wider type.
  • @@ -401,7 +405,7 @@ The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/01/16 07:54:23 $ + Last modified: $Date: 2006/01/16 16:31:40 $ From lattner at cs.uiuc.edu Mon Jan 16 10:34:51 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 10:34:51 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/not.ll rpcc.ll Message-ID: <200601161634.KAA19714@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Alpha: not.ll updated: 1.1 -> 1.2 rpcc.ll updated: 1.1 -> 1.2 --- Log message: Fix these testcases :( Apparently Andrew hasn't implemented ReadCycleCounter in the new isel and renamed ornot to eqv --- Diffs of the changes: (+2 -1) not.ll | 2 +- rpcc.ll | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/test/Regression/CodeGen/Alpha/not.ll diff -u llvm/test/Regression/CodeGen/Alpha/not.ll:1.1 llvm/test/Regression/CodeGen/Alpha/not.ll:1.2 --- llvm/test/Regression/CodeGen/Alpha/not.ll:1.1 Fri Apr 8 11:46:44 2005 +++ llvm/test/Regression/CodeGen/Alpha/not.ll Mon Jan 16 10:34:39 2006 @@ -1,5 +1,5 @@ ; Make sure this testcase codegens to the ornot instruction -; RUN: llvm-as < %s | llc -march=alpha | grep 'ornot' +; RUN: llvm-as < %s | llc -march=alpha | grep 'eqv' implementation ; Functions: Index: llvm/test/Regression/CodeGen/Alpha/rpcc.ll diff -u llvm/test/Regression/CodeGen/Alpha/rpcc.ll:1.1 llvm/test/Regression/CodeGen/Alpha/rpcc.ll:1.2 --- llvm/test/Regression/CodeGen/Alpha/rpcc.ll:1.1 Fri Nov 11 10:47:31 2005 +++ llvm/test/Regression/CodeGen/Alpha/rpcc.ll Mon Jan 16 10:34:39 2006 @@ -1,4 +1,5 @@ ; RUN: llvm-as < %s | llc -march=alpha | grep rpcc +; XFAIL: * declare ulong %llvm.readcyclecounter() From lattner at cs.uiuc.edu Mon Jan 16 11:52:43 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 11:52:43 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/README.txt Message-ID: <200601161752.LAA20027@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: README.txt updated: 1.22 -> 1.23 --- Log message: transfer some notes from my email to somewhere useful. --- Diffs of the changes: (+45 -0) README.txt | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 45 insertions(+) Index: llvm/lib/Target/X86/README.txt diff -u llvm/lib/Target/X86/README.txt:1.22 llvm/lib/Target/X86/README.txt:1.23 --- llvm/lib/Target/X86/README.txt:1.22 Thu Jan 12 19:20:42 2006 +++ llvm/lib/Target/X86/README.txt Mon Jan 16 11:52:31 2006 @@ -54,6 +54,10 @@ fucomi jl X jg X +Ideas: +http://gcc.gnu.org/ml/gcc-patches/2004-11/msg02410.html + + //===---------------------------------------------------------------------===// Improvements to the multiply -> shift/add algorithm: @@ -121,3 +125,44 @@ setg %al testb %al, %al # unnecessary jne .BB7 + +//===---------------------------------------------------------------------===// + +Count leading zeros and count trailing zeros: + +int clz(int X) { return __builtin_clz(X); } +int ctz(int X) { return __builtin_ctz(X); } + +$ gcc t.c -S -o - -O3 -fomit-frame-pointer -masm=intel +clz: + bsr %eax, DWORD PTR [%esp+4] + xor %eax, 31 + ret +ctz: + bsf %eax, DWORD PTR [%esp+4] + ret + +however, check that these are defined for 0 and 32. Our intrinsics are, GCC's +aren't. + +//===---------------------------------------------------------------------===// + +Use push/pop instructions in prolog/epilog sequences instead of stores off +ESP (certain code size win, perf win on some [which?] processors). + +//===---------------------------------------------------------------------===// + +Only use inc/neg/not instructions on processors where they are faster than +add/sub/xor. They are slower on the P4 due to only updating some processor +flags. + +//===---------------------------------------------------------------------===// + +Open code rint,floor,ceil,trunc: +http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02006.html +http://gcc.gnu.org/ml/gcc-patches/2004-08/msg02011.html + +//===---------------------------------------------------------------------===// + +Combine: a = sin(x), b = cos(x) into a,b = sincos(x). + From lattner at cs.uiuc.edu Mon Jan 16 11:53:12 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 11:53:12 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/README.txt Message-ID: <200601161753.LAA20088@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: README.txt updated: 1.43 -> 1.44 --- Log message: transfer some notes from my email to somewhere useful. --- Diffs of the changes: (+26 -0) README.txt | 26 ++++++++++++++++++++++++++ 1 files changed, 26 insertions(+) Index: llvm/lib/Target/PowerPC/README.txt diff -u llvm/lib/Target/PowerPC/README.txt:1.43 llvm/lib/Target/PowerPC/README.txt:1.44 --- llvm/lib/Target/PowerPC/README.txt:1.43 Fri Jan 13 19:24:22 2006 +++ llvm/lib/Target/PowerPC/README.txt Mon Jan 16 11:53:00 2006 @@ -225,3 +225,29 @@ void xxx(struct foo F); void bar() { struct foo R = { 1.0, 2.0 }; xxx(R); } +===-------------------------------------------------------------------------=== + +For this: + +int h(int i, int j, int k) { + return (i==0||j==0||k == 0); +} + +We currently emit this: + +_h: + cntlzw r2, r3 + cntlzw r3, r4 + cntlzw r4, r5 + srwi r2, r2, 5 + srwi r3, r3, 5 + srwi r4, r4, 5 + or r2, r3, r2 + or r3, r2, r4 + blr + +The ctlz/shift instructions are created by the isel, so the dag combiner doesn't +have a chance to pull the shifts through the or's (eliminating two +instructions). SETCC nodes should be custom lowered in this case, not expanded +by the isel. + From lattner at cs.uiuc.edu Mon Jan 16 11:59:06 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 11:59:06 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/README.txt Message-ID: <200601161759.LAA20135@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: README.txt updated: 1.44 -> 1.45 --- Log message: add notes from my *other* email acct. --- Diffs of the changes: (+88 -0) README.txt | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 88 insertions(+) Index: llvm/lib/Target/PowerPC/README.txt diff -u llvm/lib/Target/PowerPC/README.txt:1.44 llvm/lib/Target/PowerPC/README.txt:1.45 --- llvm/lib/Target/PowerPC/README.txt:1.44 Mon Jan 16 11:53:00 2006 +++ llvm/lib/Target/PowerPC/README.txt Mon Jan 16 11:58:54 2006 @@ -251,3 +251,91 @@ instructions). SETCC nodes should be custom lowered in this case, not expanded by the isel. +===-------------------------------------------------------------------------=== + +Darwin Stub LICM optimization: + +Loops like this: + + for (...) bar(); + +Have to go through an indirect stub if bar is external or linkonce. It would +be better to compile it as: + + fp = &bar; + for (...) fp(); + +which only computes the address of bar once (instead of each time through the +stub). This is Darwin specific and would have to be done in the code generator. +Probably not a win on x86. + +===-------------------------------------------------------------------------=== + +PowerPC i1/setcc stuff (depends on subreg stuff): + +Check out the PPC code we get for 'compare' in this testcase: +http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19672 + +oof. on top of not doing the logical crnand instead of (mfcr, mfcr, +invert, invert, or), we then have to compare it against zero instead of +using the value already in a CR! + +that should be something like + cmpw cr7, r8, r5 + cmpw cr0, r7, r3 + crnand cr0, cr0, cr7 + bne cr0, LBB_compare_4 + +instead of + cmpw cr7, r8, r5 + cmpw cr0, r7, r3 + mfcr r7, 1 + mcrf cr7, cr0 + mfcr r8, 1 + rlwinm r7, r7, 30, 31, 31 + rlwinm r8, r8, 30, 31, 31 + xori r7, r7, 1 + xori r8, r8, 1 + addi r2, r2, 1 + or r7, r8, r7 + cmpwi cr0, r7, 0 + bne cr0, LBB_compare_4 ; loopexit + +===-------------------------------------------------------------------------=== + +Simple IPO for argument passing, change: + void foo(int X, double Y, int Z) -> void foo(int X, int Z, double Y) + +the Darwin ABI specifies that any integer arguments in the first 32 bytes worth +of arguments get assigned to r3 through r10. That is, if you have a function +foo(int, double, int) you get r3, f1, r6, since the 64 bit double ate up the +argument bytes for r4 and r5. The trick then would be to shuffle the argument +order for functions we can internalize so that the maximum number of +integers/pointers get passed in regs before you see any of the fp arguments. + +Instead of implementing this, it would actually probably be easier to just +implement a PPC fastcc, where we could do whatever we wanted to the CC, +including having this work sanely. + +===-------------------------------------------------------------------------=== + +Fix Darwin FP-In-Integer Registers ABI + +Darwin passes doubles in structures in integer registers, which is very very +bad. Add something like a BIT_CONVERT to LLVM, then do an i-p transformation +that percolates these things out of functions. + +Check out how horrible this is: +http://gcc.gnu.org/ml/gcc/2005-10/msg01036.html + +This is an extension of "interprocedural CC unmunging" that can't be done with +just fastcc. + +===-------------------------------------------------------------------------=== + +Code Gen IPO optimization: + +Squish small scalar globals together into a single global struct, allowing the +address of the struct to be CSE'd, avoiding PIC accesses (also reduces the size +of the GOT on targets with one). + From lattner at cs.uiuc.edu Mon Jan 16 13:47:32 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 13:47:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200601161947.NAA20703@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.414 -> 1.415 --- Log message: fix a crash due to missing parens --- Diffs of the changes: (+1 -1) InstructionCombining.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.414 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.415 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.414 Fri Jan 13 16:48:06 2006 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Mon Jan 16 13:47:21 2006 @@ -748,7 +748,7 @@ // This is a sign extend if the top bits are known zero. Constant *Mask = ConstantInt::getAllOnesValue(XorLHS->getType()); Mask = ConstantExpr::getShl(Mask, - ConstantInt::get(Type::UByteTy, 64-TySizeBits-Size)); + ConstantInt::get(Type::UByteTy, 64-(TySizeBits-Size))); if (!MaskedValueIsZero(XorLHS, cast(Mask))) Size = 0; // Not a sign ext, but can't be any others either. goto FoundSExt; From alenhar2 at cs.uiuc.edu Mon Jan 16 13:53:37 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 16 Jan 2006 13:53:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelLowering.cpp AlphaISelLowering.h Message-ID: <200601161953.NAA20746@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelLowering.cpp updated: 1.21 -> 1.22 AlphaISelLowering.h updated: 1.8 -> 1.9 --- Log message: Friendly names --- Diffs of the changes: (+19 -1) AlphaISelLowering.cpp | 15 +++++++++++++++ AlphaISelLowering.h | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.21 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.22 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.21 Fri Jan 13 21:14:10 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Mon Jan 16 13:53:25 2006 @@ -128,6 +128,21 @@ useITOF = TM.getSubtarget().hasF2I(); } +const char *AlphaTargetLowering::getTargetNodeName(unsigned Opcode) const { + switch (Opcode) { + default: return 0; + case AlphaISD::ITOFT_: return "Alpha::ITOFT_"; + case AlphaISD::FTOIT_: return "Alpha::FTOIT_"; + case AlphaISD::CVTQT_: return "Alpha::CVTQT_"; + case AlphaISD::CVTQS_: return "Alpha::CVTQS_"; + case AlphaISD::CVTTQ_: return "Alpha::CVTTQ_"; + case AlphaISD::GPRelHi: return "Alpha::GPRelHi"; + case AlphaISD::GPRelLo: return "Alpha::GPRelLo"; + case AlphaISD::RelLit: return "Alpha::RelLit"; + case AlphaISD::GlobalBaseReg: return "Alpha::GlobalBaseReg"; + case AlphaISD::DivCall: return "Alpha::DivCall"; + } +} //http://www.cs.arizona.edu/computer.help/policy/DIGITAL_unix/AA-PY8AC-TET1_html/callCH3.html#BLOCK21 Index: llvm/lib/Target/Alpha/AlphaISelLowering.h diff -u llvm/lib/Target/Alpha/AlphaISelLowering.h:1.8 llvm/lib/Target/Alpha/AlphaISelLowering.h:1.9 --- llvm/lib/Target/Alpha/AlphaISelLowering.h:1.8 Sat Dec 24 19:34:27 2005 +++ llvm/lib/Target/Alpha/AlphaISelLowering.h Mon Jan 16 13:53:25 2006 @@ -56,7 +56,10 @@ /// LowerOperation - Provide custom lowering hooks for some operations. /// virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); - + + //Friendly names for dumps + const char *getTargetNodeName(unsigned Opcode) const; + /// LowerArguments - This hook must be implemented to indicate how we should /// lower the arguments for the specified function, into the specified DAG. virtual std::vector From reid at x10sys.com Mon Jan 16 15:06:14 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:06:14 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp Message-ID: <200601162106.PAA21343@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AutoUpgrade.cpp added (r1.1) --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This file makes the helper functions for auto-upgrade of llvm assembly and bytecode more accessible. This is part of de-overloading of intrinsic functions to support the flat symbol table (no type planes). --- Diffs of the changes: (+105 -0) AutoUpgrade.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 105 insertions(+) Index: llvm/lib/VMCore/AutoUpgrade.cpp diff -c /dev/null llvm/lib/VMCore/AutoUpgrade.cpp:1.1 *** /dev/null Mon Jan 16 15:06:11 2006 --- llvm/lib/VMCore/AutoUpgrade.cpp Mon Jan 16 15:06:01 2006 *************** *** 0 **** --- 1,105 ---- + //===-- AutoUpgrade.cpp - Implement auto-upgrade helper functions ---------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Reid Spencer and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the auto-upgrade helper functions + // + //===----------------------------------------------------------------------===// + + #include "llvm/Assembly/AutoUpgrade.h" + #include "llvm/Function.h" + #include "llvm/Type.h" + #include + + using namespace llvm; + + // UpgradeIntrinsicFunction - Convert overloaded intrinsic function names to + // their non-overloaded variants by appending the appropriate suffix based on + // the argument types. + bool llvm::UpgradeIntrinsicFunction(Function* F) { + + // Get the Function's name. + const std::string& Name = F->getName(); + + // Quickly eliminate it, if it's not a candidate. + if (Name.length() <= 5 || Name[0] != 'l' || Name[1] != 'l' || Name[2] != + 'v' || Name[3] != 'm' || Name[4] != '.') + return false; + + // See if its one of the name's we're interested in. + switch (Name[5]) { + case 'b': + if (Name == "llvm.bswap") { + const Type* Ty = F->getReturnType(); + std::string new_name = Name; + if (Ty == Type::UShortTy || Ty == Type::ShortTy) + new_name += ".i16"; + else if (Ty == Type::UIntTy || Ty == Type::IntTy) + new_name += ".i32"; + else if (Ty == Type::ULongTy || Ty == Type::LongTy) + new_name += ".i64"; + std::cerr << "WARNING: change " << Name << " to " + << new_name << "\n"; + F->setName(new_name); + return true; + } + break; + case 'c': + if (Name == "llvm.ctpop" || Name == "llvm.ctlz" || + Name == "llvm.cttz") { + const Type* Ty = F->getReturnType(); + std::string new_name = Name; + if (Ty == Type::UByteTy || Ty == Type::SByteTy) + new_name += ".i8"; + else if (Ty == Type::UShortTy || Ty == Type::ShortTy) + new_name += ".i16"; + else if (Ty == Type::UIntTy || Ty == Type::IntTy) + new_name += ".i32"; + else if (Ty == Type::ULongTy || Ty == Type::LongTy) + new_name += ".i64"; + std::cerr << "WARNING: change " << Name << " to " + << new_name << "\n"; + F->setName(new_name); + return true; + } + break; + case 'i': + if (Name == "llvm.isunordered") { + Function::const_arg_iterator ArgIt = F->arg_begin(); + const Type* Ty = ArgIt->getType(); + std::string new_name = Name; + if (Ty == Type::FloatTy) + new_name += ".f32"; + else if (Ty == Type::DoubleTy) + new_name += ".f64"; + std::cerr << "WARNING: change " << Name << " to " + << new_name << "\n"; + F->setName(new_name); + return true; + } + break; + case 's': + if (Name == "llvm.sqrt") { + const Type* Ty = F->getReturnType(); + std::string new_name = Name; + if (Ty == Type::FloatTy) + new_name += ".f32"; + else if (Ty == Type::DoubleTy) { + new_name += ".f64"; + } + std::cerr << "WARNING: change " << Name << " to " + << new_name << "\n"; + F->setName(new_name); + return true; + } + break; + default: + break; + } + return false; + } From reid at x10sys.com Mon Jan 16 15:06:14 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:06:14 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Assembly/AutoUpgrade.h Message-ID: <200601162106.PAA21347@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Assembly: AutoUpgrade.h added (r1.1) --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This file makes the helper functions for auto-upgrade of llvm assembly and bytecode more accessible. This is part of de-overloading of intrinsic functions to support the flat symbol table (no type planes). --- Diffs of the changes: (+33 -0) AutoUpgrade.h | 33 +++++++++++++++++++++++++++++++++ 1 files changed, 33 insertions(+) Index: llvm/include/llvm/Assembly/AutoUpgrade.h diff -c /dev/null llvm/include/llvm/Assembly/AutoUpgrade.h:1.1 *** /dev/null Mon Jan 16 15:06:11 2006 --- llvm/include/llvm/Assembly/AutoUpgrade.h Mon Jan 16 15:06:01 2006 *************** *** 0 **** --- 1,33 ---- + //===-- llvm/Assembly/AutoUpgrade.h - AutoUpgrade Helpers --------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Reid Spencer is distributed under the University + // of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // These functions are implemented by the lib/VMCore/AutoUpgrade.cpp. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_ASSEMBLY_AUTOUPGRADE_H + #define LLVM_ASSEMBLY_AUTOUPGRADE_H + + namespace llvm { + class Function; + + /// This function inspects the Function \p F to see if it is an old overloaded + /// intrinsic. If it is, the Function's name is changed to add a suffix that + /// indicates the kind of arguments or result that it accepts. In LLVM release + /// 1.7, the overloading of intrinsic functions was replaced with separate + /// functions for each of the various argument sizes. This function implements + /// the auto-upgrade feature from the old overloaded names to the new + /// non-overloaded names. + /// @param F The Function to potentially auto-upgrade. + /// @brief Remove overloaded intrinsic function names. + bool UpgradeIntrinsicFunction(Function* F); + + } // End llvm namespace + + #endif From reid at x10sys.com Mon Jan 16 15:12:51 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Function.cpp Verifier.cpp Message-ID: <200601162112.PAA21468@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Function.cpp updated: 1.99 -> 1.100 Verifier.cpp updated: 1.142 -> 1.143 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+205 -54) Function.cpp | 98 ++++++++++++++++++++--------------- Verifier.cpp | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 205 insertions(+), 54 deletions(-) Index: llvm/lib/VMCore/Function.cpp diff -u llvm/lib/VMCore/Function.cpp:1.99 llvm/lib/VMCore/Function.cpp:1.100 --- llvm/lib/VMCore/Function.cpp:1.99 Sun Jan 15 02:40:16 2006 +++ llvm/lib/VMCore/Function.cpp Mon Jan 16 15:12:35 2006 @@ -200,79 +200,93 @@ /// llvm/Intrinsics.h. /// unsigned Function::getIntrinsicID() const { - if (getName().size() < 5 || getName()[4] != '.' || getName()[0] != 'l' || - getName()[1] != 'l' || getName()[2] != 'v' || getName()[3] != 'm') + const std::string& Name = this->getName(); + if (Name.size() < 5 || Name[4] != '.' || Name[0] != 'l' || Name[1] != 'l' + || Name[2] != 'v' || Name[3] != 'm') return 0; // All intrinsics start with 'llvm.' - assert(getName().size() != 5 && "'llvm.' is an invalid intrinsic name!"); + assert(Name.size() != 5 && "'llvm.' is an invalid intrinsic name!"); - switch (getName()[5]) { + switch (Name[5]) { case 'b': - if (getName() == "llvm.bswap.i16") return Intrinsic::bswap_i16; - if (getName() == "llvm.bswap.i32") return Intrinsic::bswap_i32; - if (getName() == "llvm.bswap.i64") return Intrinsic::bswap_i64; + if (Name == "llvm.bswap.i16") return Intrinsic::bswap_i16; + if (Name == "llvm.bswap.i32") return Intrinsic::bswap_i32; + if (Name == "llvm.bswap.i64") return Intrinsic::bswap_i64; break; case 'c': - if (getName() == "llvm.ctpop") return Intrinsic::ctpop; - if (getName() == "llvm.cttz") return Intrinsic::cttz; - if (getName() == "llvm.ctlz") return Intrinsic::ctlz; + if (Name == "llvm.ctpop.i8") return Intrinsic::ctpop_i8; + if (Name == "llvm.ctpop.i16") return Intrinsic::ctpop_i16; + if (Name == "llvm.ctpop.i32") return Intrinsic::ctpop_i32; + if (Name == "llvm.ctpop.i64") return Intrinsic::ctpop_i64; + if (Name == "llvm.cttz.i8") return Intrinsic::cttz_i8; + if (Name == "llvm.cttz.i16") return Intrinsic::cttz_i16; + if (Name == "llvm.cttz.i32") return Intrinsic::cttz_i32; + if (Name == "llvm.cttz.i64") return Intrinsic::cttz_i64; + if (Name == "llvm.ctlz.i8") return Intrinsic::ctlz_i8; + if (Name == "llvm.ctlz.i16") return Intrinsic::ctlz_i16; + if (Name == "llvm.ctlz.i32") return Intrinsic::ctlz_i32; + if (Name == "llvm.ctlz.i64") return Intrinsic::ctlz_i64; break; case 'd': - if (getName() == "llvm.dbg.stoppoint") return Intrinsic::dbg_stoppoint; - if (getName() == "llvm.dbg.region.start")return Intrinsic::dbg_region_start; - if (getName() == "llvm.dbg.region.end") return Intrinsic::dbg_region_end; - if (getName() == "llvm.dbg.func.start") return Intrinsic::dbg_func_start; - if (getName() == "llvm.dbg.declare") return Intrinsic::dbg_declare; + if (Name == "llvm.dbg.stoppoint") return Intrinsic::dbg_stoppoint; + if (Name == "llvm.dbg.region.start")return Intrinsic::dbg_region_start; + if (Name == "llvm.dbg.region.end") return Intrinsic::dbg_region_end; + if (Name == "llvm.dbg.func.start") return Intrinsic::dbg_func_start; + if (Name == "llvm.dbg.declare") return Intrinsic::dbg_declare; break; case 'f': - if (getName() == "llvm.frameaddress") return Intrinsic::frameaddress; + if (Name == "llvm.frameaddress") return Intrinsic::frameaddress; break; case 'g': - if (getName() == "llvm.gcwrite") return Intrinsic::gcwrite; - if (getName() == "llvm.gcread") return Intrinsic::gcread; - if (getName() == "llvm.gcroot") return Intrinsic::gcroot; + if (Name == "llvm.gcwrite") return Intrinsic::gcwrite; + if (Name == "llvm.gcread") return Intrinsic::gcread; + if (Name == "llvm.gcroot") return Intrinsic::gcroot; break; case 'i': - if (getName() == "llvm.isunordered") return Intrinsic::isunordered; + if (Name == "llvm.isunordered.f32") + return Intrinsic::isunordered_f32; + if (Name == "llvm.isunordered.f64") + return Intrinsic::isunordered_f64; break; case 'l': - if (getName() == "llvm.longjmp") return Intrinsic::longjmp; + if (Name == "llvm.longjmp") return Intrinsic::longjmp; break; case 'm': - if (getName() == "llvm.memcpy") return Intrinsic::memcpy; - if (getName() == "llvm.memmove") return Intrinsic::memmove; - if (getName() == "llvm.memset") return Intrinsic::memset; + if (Name == "llvm.memcpy") return Intrinsic::memcpy; + if (Name == "llvm.memmove") return Intrinsic::memmove; + if (Name == "llvm.memset") return Intrinsic::memset; break; case 'p': - if (getName() == "llvm.prefetch") return Intrinsic::prefetch; - if (getName() == "llvm.pcmarker") return Intrinsic::pcmarker; + if (Name == "llvm.prefetch") return Intrinsic::prefetch; + if (Name == "llvm.pcmarker") return Intrinsic::pcmarker; break; case 'r': - if (getName() == "llvm.returnaddress") return Intrinsic::returnaddress; - if (getName() == "llvm.readport") return Intrinsic::readport; - if (getName() == "llvm.readio") return Intrinsic::readio; - if (getName() == "llvm.readcyclecounter") return Intrinsic::readcyclecounter; + if (Name == "llvm.returnaddress") return Intrinsic::returnaddress; + if (Name == "llvm.readport") return Intrinsic::readport; + if (Name == "llvm.readio") return Intrinsic::readio; + if (Name == "llvm.readcyclecounter") return Intrinsic::readcyclecounter; break; case 's': - if (getName() == "llvm.setjmp") return Intrinsic::setjmp; - if (getName() == "llvm.sigsetjmp") return Intrinsic::sigsetjmp; - if (getName() == "llvm.siglongjmp") return Intrinsic::siglongjmp; - if (getName() == "llvm.stackrestore") return Intrinsic::stackrestore; - if (getName() == "llvm.stacksave") return Intrinsic::stacksave; - if (getName() == "llvm.sqrt") return Intrinsic::sqrt; + if (Name == "llvm.setjmp") return Intrinsic::setjmp; + if (Name == "llvm.sigsetjmp") return Intrinsic::sigsetjmp; + if (Name == "llvm.siglongjmp") return Intrinsic::siglongjmp; + if (Name == "llvm.stackrestore") return Intrinsic::stackrestore; + if (Name == "llvm.stacksave") return Intrinsic::stacksave; + if (Name == "llvm.sqrt.f32") return Intrinsic::sqrt_f32; + if (Name == "llvm.sqrt.f64") return Intrinsic::sqrt_f64; break; case 'v': - if (getName() == "llvm.va_copy") return Intrinsic::vacopy; - if (getName() == "llvm.va_end") return Intrinsic::vaend; - if (getName() == "llvm.va_start") return Intrinsic::vastart; + if (Name == "llvm.va_copy") return Intrinsic::vacopy; + if (Name == "llvm.va_end") return Intrinsic::vaend; + if (Name == "llvm.va_start") return Intrinsic::vastart; break; case 'w': - if (getName() == "llvm.writeport") return Intrinsic::writeport; - if (getName() == "llvm.writeio") return Intrinsic::writeio; + if (Name == "llvm.writeport") return Intrinsic::writeport; + if (Name == "llvm.writeio") return Intrinsic::writeio; break; } // The "llvm." namespace is reserved! - assert(0 && "Unknown LLVM intrinsic function!"); + assert(!"Unknown LLVM intrinsic function!"); return 0; } Index: llvm/lib/VMCore/Verifier.cpp diff -u llvm/lib/VMCore/Verifier.cpp:1.142 llvm/lib/VMCore/Verifier.cpp:1.143 --- llvm/lib/VMCore/Verifier.cpp:1.142 Sun Jan 15 15:58:50 2006 +++ llvm/lib/VMCore/Verifier.cpp Mon Jan 16 15:12:35 2006 @@ -128,7 +128,8 @@ if (I->isExternal()) visitFunction(*I); } - for (Module::global_iterator I = M.global_begin(), E = M.global_end(); I != E; ++I) + for (Module::global_iterator I = M.global_begin(), E = M.global_end(); + I != E; ++I) visitGlobalVariable(*I); // If the module is broken, abort at this time. @@ -729,15 +730,27 @@ break; } - case Intrinsic::isunordered: + case Intrinsic::isunordered_f32: Assert1(FT->getNumParams() == 2, "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == Type::BoolTy, "Return type is not bool!", IF); Assert1(FT->getParamType(0) == FT->getParamType(1), "Arguments must be of the same type!", IF); - Assert1(FT->getParamType(0)->isFloatingPoint(), - "Argument is not a floating point type!", IF); + Assert1(FT->getParamType(0) == Type::FloatTy, + "Arguments must be a 32-bit floating point type!", IF); + NumArgs = 2; + break; + + case Intrinsic::isunordered_f64: + Assert1(FT->getNumParams() == 2, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == Type::BoolTy, + "Return type is not bool!", IF); + Assert1(FT->getParamType(0) == FT->getParamType(1), + "Arguments must be of the same type!", IF); + Assert1(FT->getParamType(0) == Type::DoubleTy, + "Argument is not a 64-bit floating point type!", IF); NumArgs = 2; break; @@ -779,23 +792,147 @@ NumArgs = 1; break; - case Intrinsic::ctpop: - case Intrinsic::ctlz: - case Intrinsic::cttz: + case Intrinsic::ctpop_i8: Assert1(FT->getNumParams() == 1, "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0)->isIntegral(), - "Argument must be of an int type!", IF); + Assert1(FT->getParamType(0) == Type::UByteTy + || FT->getParamType(0) == Type::SByteTy, + "Argument must be a byte type!", IF); + NumArgs = 1; + break; + + case Intrinsic::ctpop_i16: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UShortTy + || FT->getParamType(0) == Type::ShortTy, + "Argument must be a short type!", IF); + NumArgs = 1; + break; + + case Intrinsic::ctpop_i32: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UIntTy + || FT->getParamType(0) == Type::IntTy, + "Argument must be an int type!", IF); + NumArgs = 1; + break; + + case Intrinsic::ctpop_i64: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::ULongTy + || FT->getParamType(0) == Type::LongTy, + "Argument must be a long type!", IF); + NumArgs = 1; + break; + + case Intrinsic::ctlz_i8: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UByteTy + || FT->getParamType(0) == Type::SByteTy, + "Argument must be a byte type!", IF); + NumArgs = 1; + break; + + case Intrinsic::ctlz_i16: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UShortTy + || FT->getParamType(0) == Type::ShortTy, + "Argument must be a short type!", IF); + NumArgs = 1; + break; + case Intrinsic::ctlz_i32: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UIntTy + || FT->getParamType(0) == Type::IntTy, + "Argument must be an int type!", IF); + NumArgs = 1; + break; + case Intrinsic::ctlz_i64: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::ULongTy + || FT->getParamType(0) == Type::LongTy, + "Argument must be a long type!", IF); + NumArgs = 1; + break; + case Intrinsic::cttz_i8: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UByteTy + || FT->getParamType(0) == Type::SByteTy, + "Argument must be a byte type!", IF); + NumArgs = 1; + break; + case Intrinsic::cttz_i16: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UShortTy + || FT->getParamType(0) == Type::ShortTy, + "Argument must be a short type!", IF); + NumArgs = 1; + break; + case Intrinsic::cttz_i32: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::UIntTy + || FT->getParamType(0) == Type::IntTy, + "Argument must be an int type!", IF); + NumArgs = 1; + break; + case Intrinsic::cttz_i64: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type does not match source type", IF); + Assert1(FT->getParamType(0) == Type::ULongTy + || FT->getParamType(0) == Type::LongTy, + "Argument must be a long type!", IF); + NumArgs = 1; + break; + + case Intrinsic::sqrt_f32: + Assert1(FT->getNumParams() == 1, + "Illegal # arguments for intrinsic function!", IF); + Assert1(FT->getParamType(0) == Type::FloatTy, + "Argument is not a 32-bit floating point type!", IF); + Assert1(FT->getReturnType() == FT->getParamType(0), + "Return type is not the same as argument type!", IF); NumArgs = 1; break; - case Intrinsic::sqrt: + case Intrinsic::sqrt_f64: Assert1(FT->getNumParams() == 1, "Illegal # arguments for intrinsic function!", IF); - Assert1(FT->getParamType(0)->isFloatingPoint(), - "Argument is not a floating point type!", IF); + Assert1(FT->getParamType(0) == Type::DoubleTy, + "Argument is not a 64-bit floating point type!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type is not the same as argument type!", IF); NumArgs = 1; From reid at x10sys.com Mon Jan 16 15:12:52 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:52 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/IntrinsicLowering.cpp Message-ID: <200601162112.PAA21472@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: IntrinsicLowering.cpp updated: 1.38 -> 1.39 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+23 -11) IntrinsicLowering.cpp | 34 +++++++++++++++++++++++----------- 1 files changed, 23 insertions(+), 11 deletions(-) Index: llvm/lib/CodeGen/IntrinsicLowering.cpp diff -u llvm/lib/CodeGen/IntrinsicLowering.cpp:1.38 llvm/lib/CodeGen/IntrinsicLowering.cpp:1.39 --- llvm/lib/CodeGen/IntrinsicLowering.cpp:1.38 Mon Jan 16 01:57:00 2006 +++ llvm/lib/CodeGen/IntrinsicLowering.cpp Mon Jan 16 15:12:35 2006 @@ -113,11 +113,13 @@ Type::IntTy, (--(--I->arg_end()))->getType(), (Type *)0); break; - case Intrinsic::isunordered: + case Intrinsic::isunordered_f32: + case Intrinsic::isunordered_f64: EnsureFunctionExists(M, "isunordered", I->arg_begin(), I->arg_end(), Type::BoolTy); break; - case Intrinsic::sqrt: + case Intrinsic::sqrt_f32: + case Intrinsic::sqrt_f64: if(I->arg_begin()->getType() == Type::FloatTy) EnsureFunctionExists(M, "sqrtf", I->arg_begin(), I->arg_end(), Type::FloatTy); @@ -326,22 +328,30 @@ AbortFCache); break; } - + case Intrinsic::ctpop_i8: + case Intrinsic::ctpop_i16: + case Intrinsic::ctpop_i32: + case Intrinsic::ctpop_i64: + CI->replaceAllUsesWith(LowerCTPOP(CI->getOperand(1), CI)); + break; + case Intrinsic::bswap_i16: case Intrinsic::bswap_i32: case Intrinsic::bswap_i64: CI->replaceAllUsesWith(LowerBSWAP(CI->getOperand(1), CI)); break; - case Intrinsic::ctpop: - CI->replaceAllUsesWith(LowerCTPOP(CI->getOperand(1), CI)); - break; - - case Intrinsic::ctlz: + case Intrinsic::ctlz_i8: + case Intrinsic::ctlz_i16: + case Intrinsic::ctlz_i32: + case Intrinsic::ctlz_i64: CI->replaceAllUsesWith(LowerCTLZ(CI->getOperand(1), CI)); break; - case Intrinsic::cttz: { + case Intrinsic::cttz_i8: + case Intrinsic::cttz_i16: + case Intrinsic::cttz_i32: + case Intrinsic::cttz_i64: { // cttz(x) -> ctpop(~X & (X-1)) Value *Src = CI->getOperand(1); Value *NotSrc = BinaryOperator::createNot(Src, Src->getName()+".not", CI); @@ -419,7 +429,8 @@ (*(CI->op_begin()+1))->getType(), MemsetFCache); break; } - case Intrinsic::isunordered: { + case Intrinsic::isunordered_f32: + case Intrinsic::isunordered_f64: { Value *L = CI->getOperand(1); Value *R = CI->getOperand(2); @@ -430,7 +441,8 @@ "isunordered", CI)); break; } - case Intrinsic::sqrt: { + case Intrinsic::sqrt_f32: + case Intrinsic::sqrt_f64: { static Function *sqrtFCache = 0; static Function *sqrtfFCache = 0; if(CI->getType() == Type::FloatTy) From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/Local.cpp Message-ID: <200601162112.PAA21476@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: Local.cpp updated: 1.49 -> 1.50 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+16 -5) Local.cpp | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) Index: llvm/lib/Transforms/Utils/Local.cpp diff -u llvm/lib/Transforms/Utils/Local.cpp:1.49 llvm/lib/Transforms/Utils/Local.cpp:1.50 --- llvm/lib/Transforms/Utils/Local.cpp:1.49 Fri Jan 13 19:25:24 2006 +++ llvm/lib/Transforms/Utils/Local.cpp Mon Jan 16 15:12:35 2006 @@ -297,14 +297,25 @@ case Intrinsic::returnaddress: case Intrinsic::frameaddress: case Intrinsic::stacksave: - case Intrinsic::isunordered: + case Intrinsic::isunordered_f32: + case Intrinsic::isunordered_f64: case Intrinsic::bswap_i16: case Intrinsic::bswap_i32: case Intrinsic::bswap_i64: - case Intrinsic::ctpop: - case Intrinsic::ctlz: - case Intrinsic::cttz: - case Intrinsic::sqrt: + case Intrinsic::ctpop_i8: + case Intrinsic::ctpop_i16: + case Intrinsic::ctpop_i32: + case Intrinsic::ctpop_i64: + case Intrinsic::ctlz_i8: + case Intrinsic::ctlz_i16: + case Intrinsic::ctlz_i32: + case Intrinsic::ctlz_i64: + case Intrinsic::cttz_i8: + case Intrinsic::cttz_i16: + case Intrinsic::cttz_i32: + case Intrinsic::cttz_i64: + case Intrinsic::sqrt_f32: + case Intrinsic::sqrt_f64: return true; // These intrinsics have no side effects. } return false; From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Intrinsics.h Message-ID: <200601162112.PAA21480@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm: Intrinsics.h updated: 1.35 -> 1.36 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+16 -5) Intrinsics.h | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) Index: llvm/include/llvm/Intrinsics.h diff -u llvm/include/llvm/Intrinsics.h:1.35 llvm/include/llvm/Intrinsics.h:1.36 --- llvm/include/llvm/Intrinsics.h:1.35 Fri Jan 13 19:25:24 2006 +++ llvm/include/llvm/Intrinsics.h Mon Jan 16 15:12:35 2006 @@ -62,16 +62,27 @@ memcpy, // Copy non-overlapping memory blocks memmove, // Copy potentially overlapping memory blocks memset, // Fill memory with a byte value - isunordered, // Return true if either argument is a NaN - sqrt, // Square root + isunordered_f32,// Return true if either float argument is a NaN + isunordered_f64,// Return true if either double argument is a NaN + sqrt_f32, // Square root of float + sqrt_f64, // Square root of double // Bit manipulation instrinsics. bswap_i16, // Byteswap 16 bits bswap_i32, // Byteswap 32 bits bswap_i64, // Byteswap 64 bits - ctpop, // Count population - ctlz, // Count leading zeros - cttz, // Count trailing zeros + ctpop_i8, // Count population of sbyte + ctpop_i16, // Count population of short + ctpop_i32, // Count population of int + ctpop_i64, // Count population of long + ctlz_i8, // Count leading zeros of sbyte + ctlz_i16, // Count leading zeros of short + ctlz_i32, // Count leading zeros of int + ctlz_i64, // Count leading zeros of long + cttz_i8, // Count trailing zeros of sbyte + cttz_i16, // Count trailing zeros of short + cttz_i32, // Count trailing zeros of int + cttz_i64, // Count trailing zeros of long // Input/Output intrinsics. readport, From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Analysis/ConstantFolding.cpp Message-ID: <200601162112.PAA21496@zion.cs.uiuc.edu> Changes in directory llvm/lib/Analysis: ConstantFolding.cpp updated: 1.2 -> 1.3 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+18 -7) ConstantFolding.cpp | 25 ++++++++++++++++++------- 1 files changed, 18 insertions(+), 7 deletions(-) Index: llvm/lib/Analysis/ConstantFolding.cpp diff -u llvm/lib/Analysis/ConstantFolding.cpp:1.2 llvm/lib/Analysis/ConstantFolding.cpp:1.3 --- llvm/lib/Analysis/ConstantFolding.cpp:1.2 Fri Jan 13 19:25:24 2006 +++ llvm/lib/Analysis/ConstantFolding.cpp Mon Jan 16 15:12:35 2006 @@ -35,15 +35,26 @@ const std::string &Name = F->getName(); switch (F->getIntrinsicID()) { - case Intrinsic::isunordered: - case Intrinsic::sqrt: + case Intrinsic::isunordered_f32: + case Intrinsic::isunordered_f64: + case Intrinsic::sqrt_f32: + case Intrinsic::sqrt_f64: case Intrinsic::bswap_i16: case Intrinsic::bswap_i32: case Intrinsic::bswap_i64: // FIXME: these should be constant folded as well - //case Intrinsic::ctpop: - //case Intrinsic::ctlz: - //case Intrinsic::cttz: + //case Intrinsic::ctpop_i8: + //case Intrinsic::ctpop_i16: + //case Intrinsic::ctpop_i32: + //case Intrinsic::ctpop_i64: + //case Intrinsic::ctlz_i8: + //case Intrinsic::ctlz_i16: + //case Intrinsic::ctlz_i32: + //case Intrinsic::ctlz_i64: + //case Intrinsic::cttz_i8: + //case Intrinsic::cttz_i16: + //case Intrinsic::cttz_i32: + //case Intrinsic::cttz_i64: return true; default: break; } @@ -125,7 +136,7 @@ return ConstantFP::get(Ty, log(V)); else if (Name == "log10" && V > 0) return ConstantFoldFP(log10, V, Ty); - else if (Name == "llvm.sqrt") { + else if (Name == "llvm.sqrt.f32" || Name == "llvm.sqrt.f64") { if (V >= -0.0) return ConstantFP::get(Ty, sqrt(V)); else // Undefined @@ -164,7 +175,7 @@ if (ConstantFP *Op2 = dyn_cast(Operands[1])) { double Op2V = Op2->getValue(); - if (Name == "llvm.isunordered") + if (Name == "llvm.isunordered.f32" || Name == "llvm.isunordered.f64") return ConstantBool::get(IsNAN(Op1V) || IsNAN(Op2V)); else if (Name == "pow") { From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Message-ID: <200601162112.PAA21487@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.176 -> 1.177 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+2 -0) Reader.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.176 llvm/lib/Bytecode/Reader/Reader.cpp:1.177 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.176 Tue Jan 10 13:04:39 2006 +++ llvm/lib/Bytecode/Reader/Reader.cpp Mon Jan 16 15:12:35 2006 @@ -17,6 +17,7 @@ //===----------------------------------------------------------------------===// #include "Reader.h" +#include "llvm/Assembly/AutoUpgrade.h" #include "llvm/Bytecode/BytecodeHandler.h" #include "llvm/BasicBlock.h" #include "llvm/CallingConv.h" @@ -2002,6 +2003,7 @@ // Insert the place holder. Function *Func = new Function(FTy, GlobalValue::ExternalLinkage, "", TheModule); + UpgradeIntrinsicFunction(Func); insertValue(Func, (FnSignature & (~0U >> 1)) >> 5, ModuleValues); // Flags are not used yet. From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200601162112.PAA21504@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.125 -> 1.126 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+16 -5) SelectionDAGISel.cpp | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.125 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.126 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.125 Fri Jan 13 21:18:27 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Mon Jan 16 15:12:35 2006 @@ -963,12 +963,14 @@ setValue(&I, DAG.getNode(ISD::UNDEF, TLI.getValueType(I.getType()))); return 0; - case Intrinsic::isunordered: + case Intrinsic::isunordered_f32: + case Intrinsic::isunordered_f64: setValue(&I, DAG.getSetCC(MVT::i1,getValue(I.getOperand(1)), getValue(I.getOperand(2)), ISD::SETUO)); return 0; - case Intrinsic::sqrt: + case Intrinsic::sqrt_f32: + case Intrinsic::sqrt_f64: setValue(&I, DAG.getNode(ISD::FSQRT, getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); @@ -996,17 +998,26 @@ getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); return 0; - case Intrinsic::cttz: + case Intrinsic::cttz_i8: + case Intrinsic::cttz_i16: + case Intrinsic::cttz_i32: + case Intrinsic::cttz_i64: setValue(&I, DAG.getNode(ISD::CTTZ, getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); return 0; - case Intrinsic::ctlz: + case Intrinsic::ctlz_i8: + case Intrinsic::ctlz_i16: + case Intrinsic::ctlz_i32: + case Intrinsic::ctlz_i64: setValue(&I, DAG.getNode(ISD::CTLZ, getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); return 0; - case Intrinsic::ctpop: + case Intrinsic::ctpop_i8: + case Intrinsic::ctpop_i16: + case Intrinsic::ctpop_i32: + case Intrinsic::ctpop_i64: setValue(&I, DAG.getNode(ISD::CTPOP, getValue(I.getOperand(1)).getValueType(), getValue(I.getOperand(1)))); From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200601162112.PAA21500@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.127 -> 1.128 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+28 -15) LangRef.html | 43 ++++++++++++++++++++++++++++--------------- 1 files changed, 28 insertions(+), 15 deletions(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.127 llvm/docs/LangRef.html:1.128 --- llvm/docs/LangRef.html:1.127 Sun Jan 15 14:48:27 2006 +++ llvm/docs/LangRef.html Mon Jan 16 15:12:35 2006 @@ -3394,20 +3394,21 @@
    Syntax:
    -  declare bool %llvm.isunordered(<float or double> Val1, <float or double> Val2)
    +  declare bool %llvm.isunordered.f32(float Val1, float  Val2)
    +  declare bool %llvm.isunordered.f64(double Val1, double Val2)
     
    Overview:

    -The 'llvm.isunordered' intrinsic returns true if either or both of the +The 'llvm.isunordered' intrinsics return true if either or both of the specified floating point values is a NAN.

    @@ -3435,13 +3436,14 @@
    Syntax:
    -  declare <float or double> %llvm.sqrt(<float or double> Val)
    +  declare double %llvm.sqrt.f32(float Val)
    +  declare double %llvm.sqrt.f64(double Val)
     
    Overview:

    -The 'llvm.sqrt' intrinsic returns the sqrt of the specified operand, +The 'llvm.sqrt' intrinsics return the sqrt of the specified operand, returning the same value as the libm 'sqrt' function would. Unlike sqrt in libm, however, llvm.sqrt has undefined behavior for negative numbers (which allows for better optimization). @@ -3483,6 +3485,7 @@

    Syntax:
    +  declare ushort %llvm.bswap.i8( ubyte <id> )
       declare ushort %llvm.bswap.i16( ushort <id> )
       declare uint %llvm.bswap.i32( uint <id> )
       declare ulong %llvm.bswap.i64( ulong <id> )
    @@ -3511,20 +3514,24 @@
     
     
     
     
     
    Syntax:
    -  declare int %llvm.ctpop(int <src>)
    +  declare sbyte %llvm.ctpop.i8(sbyte <src>)
    +  declare short %llvm.ctpop.i16(short <src>)
    +  declare int   %llvm.ctpop.i32(int <src>)
    +  declare long  %llvm.ctpop.i64(long <src>)
     
    Overview:

    -The 'llvm.ctpop' intrinsic counts the number of ones in a variable. +The 'llvm.ctpop' family of intrinsics counts the number of ones in a +variable.

    Arguments:
    @@ -3550,15 +3557,17 @@
    Syntax:
    -  declare int %llvm.ctlz(int <src>)
    -
    +  declare sbyte %llvm.ctlz.i8(sbyte <src>)
    +  declare short %llvm.ctlz.i16(short <src>)
    +  declare int   %llvm.ctlz.i32(int <src>)
    +  declare long  %llvm.ctlz.i64(long <src>)
     
    Overview:

    -The 'llvm.ctlz' intrinsic counts the number of leading zeros in a -variable. +The 'llvm.ctlz' family of intrinsic functions counts the number of +leading zeros in a variable.

    Arguments:
    @@ -3588,13 +3597,17 @@
    Syntax:
    -  declare int %llvm.cttz(int <src>)
    +  declare sbyte %llvm.cttz.i8(sbyte <src>)
    +  declare short %llvm.cttz.i16(short <src>)
    +  declare int   %llvm.cttz.i32(int <src>)
    +  declare long  %llvm.cttz.i64(long <src>)
     
    Overview:

    -The 'llvm.cttz' intrinsic counts the number of trailing zeros. +The 'llvm.cttz' family of intrinsic functions counts the number of +trailing zeros.

    Arguments:
    @@ -3638,7 +3651,7 @@ Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/01/15 20:48:27 $ + Last modified: $Date: 2006/01/16 21:12:35 $ From reid at x10sys.com Mon Jan 16 15:12:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:12:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp llvmAsmParser.h llvmAsmParser.y Message-ID: <200601162112.PAA21488@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp updated: 1.29 -> 1.30 llvmAsmParser.h updated: 1.13 -> 1.14 llvmAsmParser.y updated: 1.242 -> 1.243 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : This patch is an incremental step towards supporting a flat symbol table. It de-overloads the intrinsic functions by providing type-specific intrinsics and arranging for automatically upgrading from the old overloaded name to the new non-overloaded name. Specifically: llvm.isunordered -> llvm.isunordered.f32, llvm.isunordered.f64 llvm.sqrt -> llvm.sqrt.f32, llvm.sqrt.f64 llvm.ctpop -> llvm.ctpop.i8, llvm.ctpop.i16, llvm.ctpop.i32, llvm.ctpop.i64 llvm.ctlz -> llvm.ctlz.i8, llvm.ctlz.i16, llvm.ctlz.i32, llvm.ctlz.i64 llvm.cttz -> llvm.cttz.i8, llvm.cttz.i16, llvm.cttz.i32, llvm.cttz.i64 New code should not use the overloaded intrinsic names. Warnings will be emitted if they are used. --- Diffs of the changes: (+2966 -2179) llvmAsmParser.cpp | 4780 ++++++++++++++++++++++++++++++------------------------ llvmAsmParser.h | 333 ++- llvmAsmParser.y | 7 3 files changed, 2966 insertions(+), 2154 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp diff -u llvm/lib/AsmParser/llvmAsmParser.cpp:1.29 llvm/lib/AsmParser/llvmAsmParser.cpp:1.30 --- llvm/lib/AsmParser/llvmAsmParser.cpp:1.29 Tue Jan 10 20:07:51 2006 +++ llvm/lib/AsmParser/llvmAsmParser.cpp Mon Jan 16 15:12:35 2006 @@ -1,118 +1,270 @@ +/* A Bison parser, made by GNU Bison 1.875c. */ -/* A Bison parser, made from /Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ #define yyparse llvmAsmparse -#define yylex llvmAsmlex +#define yylex llvmAsmlex #define yyerror llvmAsmerror -#define yylval llvmAsmlval -#define yychar llvmAsmchar +#define yylval llvmAsmlval +#define yychar llvmAsmchar #define yydebug llvmAsmdebug #define yynerrs llvmAsmnerrs -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define SINTVAL 259 -#define UINTVAL 260 -#define FPVAL 261 -#define VOID 262 -#define BOOL 263 -#define SBYTE 264 -#define UBYTE 265 -#define SHORT 266 -#define USHORT 267 -#define INT 268 -#define UINT 269 -#define LONG 270 -#define ULONG 271 -#define FLOAT 272 -#define DOUBLE 273 -#define TYPE 274 -#define LABEL 275 -#define VAR_ID 276 -#define LABELSTR 277 -#define STRINGCONSTANT 278 -#define IMPLEMENTATION 279 -#define ZEROINITIALIZER 280 -#define TRUETOK 281 -#define FALSETOK 282 -#define BEGINTOK 283 -#define ENDTOK 284 -#define DECLARE 285 -#define GLOBAL 286 -#define CONSTANT 287 -#define SECTION 288 -#define VOLATILE 289 -#define TO 290 -#define DOTDOTDOT 291 -#define NULL_TOK 292 -#define UNDEF 293 -#define CONST 294 -#define INTERNAL 295 -#define LINKONCE 296 -#define WEAK 297 -#define APPENDING 298 -#define OPAQUE 299 -#define NOT 300 -#define EXTERNAL 301 -#define TARGET 302 -#define TRIPLE 303 -#define ENDIAN 304 -#define POINTERSIZE 305 -#define LITTLE 306 -#define BIG 307 -#define ALIGN 308 -#define DEPLIBS 309 -#define CALL 310 -#define TAIL 311 -#define CC_TOK 312 -#define CCC_TOK 313 -#define FASTCC_TOK 314 -#define COLDCC_TOK 315 -#define RET 316 -#define BR 317 -#define SWITCH 318 -#define INVOKE 319 -#define UNWIND 320 -#define UNREACHABLE 321 -#define ADD 322 -#define SUB 323 -#define MUL 324 -#define DIV 325 -#define REM 326 -#define AND 327 -#define OR 328 -#define XOR 329 -#define SETLE 330 -#define SETGE 331 -#define SETLT 332 -#define SETGT 333 -#define SETEQ 334 -#define SETNE 335 -#define MALLOC 336 -#define ALLOCA 337 -#define FREE 338 -#define LOAD 339 -#define STORE 340 -#define GETELEMENTPTR 341 -#define PHI_TOK 342 -#define CAST 343 -#define SELECT 344 -#define SHL 345 -#define SHR 346 -#define VAARG 347 -#define EXTRACTELEMENT 348 -#define VAARG_old 349 -#define VANEXT_old 350 -#line 14 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + SECTION = 289, + VOLATILE = 290, + TO = 291, + DOTDOTDOT = 292, + NULL_TOK = 293, + UNDEF = 294, + CONST = 295, + INTERNAL = 296, + LINKONCE = 297, + WEAK = 298, + APPENDING = 299, + OPAQUE = 300, + NOT = 301, + EXTERNAL = 302, + TARGET = 303, + TRIPLE = 304, + ENDIAN = 305, + POINTERSIZE = 306, + LITTLE = 307, + BIG = 308, + ALIGN = 309, + DEPLIBS = 310, + CALL = 311, + TAIL = 312, + CC_TOK = 313, + CCC_TOK = 314, + FASTCC_TOK = 315, + COLDCC_TOK = 316, + RET = 317, + BR = 318, + SWITCH = 319, + INVOKE = 320, + UNWIND = 321, + UNREACHABLE = 322, + ADD = 323, + SUB = 324, + MUL = 325, + DIV = 326, + REM = 327, + AND = 328, + OR = 329, + XOR = 330, + SETLE = 331, + SETGE = 332, + SETLT = 333, + SETGT = 334, + SETEQ = 335, + SETNE = 336, + MALLOC = 337, + ALLOCA = 338, + FREE = 339, + LOAD = 340, + STORE = 341, + GETELEMENTPTR = 342, + PHI_TOK = 343, + CAST = 344, + SELECT = 345, + SHL = 346, + SHR = 347, + VAARG = 348, + EXTRACTELEMENT = 349, + VAARG_old = 350, + VANEXT_old = 351 + }; +#endif +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define SECTION 289 +#define VOLATILE 290 +#define TO 291 +#define DOTDOTDOT 292 +#define NULL_TOK 293 +#define UNDEF 294 +#define CONST 295 +#define INTERNAL 296 +#define LINKONCE 297 +#define WEAK 298 +#define APPENDING 299 +#define OPAQUE 300 +#define NOT 301 +#define EXTERNAL 302 +#define TARGET 303 +#define TRIPLE 304 +#define ENDIAN 305 +#define POINTERSIZE 306 +#define LITTLE 307 +#define BIG 308 +#define ALIGN 309 +#define DEPLIBS 310 +#define CALL 311 +#define TAIL 312 +#define CC_TOK 313 +#define CCC_TOK 314 +#define FASTCC_TOK 315 +#define COLDCC_TOK 316 +#define RET 317 +#define BR 318 +#define SWITCH 319 +#define INVOKE 320 +#define UNWIND 321 +#define UNREACHABLE 322 +#define ADD 323 +#define SUB 324 +#define MUL 325 +#define DIV 326 +#define REM 327 +#define AND 328 +#define OR 329 +#define XOR 330 +#define SETLE 331 +#define SETGE 332 +#define SETLT 333 +#define SETGT 334 +#define SETEQ 335 +#define SETNE 336 +#define MALLOC 337 +#define ALLOCA 338 +#define FREE 339 +#define LOAD 340 +#define STORE 341 +#define GETELEMENTPTR 342 +#define PHI_TOK 343 +#define CAST 344 +#define SELECT 345 +#define SHL 346 +#define SHR 347 +#define VAARG 348 +#define EXTRACTELEMENT 349 +#define VAARG_old 350 +#define VANEXT_old 351 + + + + +/* Copy the first part of user declarations. */ +#line 14 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" #include "llvm/Instructions.h" #include "llvm/Module.h" #include "llvm/SymbolTable.h" +#include "llvm/Assembly/AutoUpgrade.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MathExtras.h" @@ -200,12 +352,16 @@ ThrowException(UndefinedReferences); } + // Rename any overloaded intrinsic functions. + for (Module::iterator FI = CurrentModule->begin(), FE = + CurrentModule->end(); FI != FE; ++FI) + UpgradeIntrinsicFunction(&(*FI)); + Values.clear(); // Clear out function local definitions Types.clear(); CurrentModule = 0; } - // GetForwardRefForGlobal - Check to see if there is a forward reference // for this global. If so, remove it from the GlobalRefs map and return it. // If not, just return null. @@ -965,8 +1121,23 @@ } -#line 873 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -typedef union { + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 878 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -1005,944 +1176,1286 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif +/* Line 191 of yacc.c. */ +#line 1181 "llvmAsmParser.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 #endif -#define YYFINAL 454 -#define YYFLAG -32768 -#define YYNTBASE 111 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 350 ? yytranslate[x] : 180) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 100, - 101, 109, 2, 98, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 105, - 97, 106, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 102, 99, 104, 2, 2, 2, 2, 2, 110, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 103, - 2, 2, 107, 2, 108, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96 -}; +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 1193 "llvmAsmParser.tab.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, - 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, - 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, - 60, 62, 64, 67, 68, 70, 72, 74, 76, 77, - 78, 80, 82, 84, 87, 88, 91, 92, 96, 99, - 100, 102, 103, 107, 109, 112, 114, 116, 118, 120, - 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, - 142, 144, 146, 148, 150, 152, 154, 157, 162, 168, - 174, 178, 181, 184, 186, 190, 192, 196, 198, 199, - 204, 208, 212, 217, 222, 226, 229, 232, 235, 238, - 241, 244, 247, 250, 253, 256, 263, 269, 278, 285, - 292, 299, 306, 313, 317, 319, 321, 323, 325, 328, - 331, 334, 336, 341, 344, 345, 353, 354, 362, 366, - 371, 372, 374, 376, 380, 384, 388, 392, 396, 398, - 399, 401, 403, 405, 406, 409, 413, 415, 417, 421, - 423, 424, 433, 435, 437, 441, 443, 445, 448, 449, - 453, 455, 457, 459, 461, 463, 465, 467, 469, 473, - 475, 477, 479, 481, 483, 486, 489, 492, 496, 499, - 500, 502, 505, 508, 512, 522, 532, 541, 555, 557, - 559, 566, 572, 575, 582, 590, 592, 596, 598, 599, - 602, 604, 610, 616, 622, 625, 630, 635, 642, 647, - 652, 657, 662, 665, 673, 675, 678, 679, 681, 682, - 686, 693, 697, 704, 707, 712, 719 -}; +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; -static const short yyrhs[] = { 5, - 0, 6, 0, 3, 0, 4, 0, 68, 0, 69, - 0, 70, 0, 71, 0, 72, 0, 73, 0, 74, - 0, 75, 0, 76, 0, 77, 0, 78, 0, 79, - 0, 80, 0, 81, 0, 91, 0, 92, 0, 16, - 0, 14, 0, 12, 0, 10, 0, 17, 0, 15, - 0, 13, 0, 11, 0, 117, 0, 118, 0, 18, - 0, 19, 0, 150, 97, 0, 0, 41, 0, 42, - 0, 43, 0, 44, 0, 0, 0, 59, 0, 60, - 0, 61, 0, 58, 4, 0, 0, 54, 4, 0, - 0, 98, 54, 4, 0, 34, 24, 0, 0, 126, - 0, 0, 98, 129, 128, 0, 126, 0, 54, 4, - 0, 132, 0, 8, 0, 134, 0, 8, 0, 134, - 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, - 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, - 0, 19, 0, 20, 0, 21, 0, 45, 0, 133, - 0, 163, 0, 99, 4, 0, 131, 100, 136, 101, - 0, 102, 4, 103, 134, 104, 0, 105, 4, 103, - 134, 106, 0, 107, 135, 108, 0, 107, 108, 0, - 134, 109, 0, 134, 0, 135, 98, 134, 0, 135, - 0, 135, 98, 37, 0, 37, 0, 0, 132, 102, - 139, 104, 0, 132, 102, 104, 0, 132, 110, 24, - 0, 132, 105, 139, 106, 0, 132, 107, 139, 108, - 0, 132, 107, 108, 0, 132, 38, 0, 132, 39, - 0, 132, 163, 0, 132, 138, 0, 132, 26, 0, - 117, 112, 0, 118, 4, 0, 9, 27, 0, 9, - 28, 0, 120, 7, 0, 89, 100, 137, 36, 132, - 101, 0, 87, 100, 137, 177, 101, 0, 90, 100, - 137, 98, 137, 98, 137, 101, 0, 113, 100, 137, - 98, 137, 101, 0, 114, 100, 137, 98, 137, 101, - 0, 115, 100, 137, 98, 137, 101, 0, 116, 100, - 137, 98, 137, 101, 0, 94, 100, 137, 98, 137, - 101, 0, 139, 98, 137, 0, 137, 0, 32, 0, - 33, 0, 142, 0, 142, 159, 0, 142, 160, 0, - 142, 25, 0, 143, 0, 143, 121, 20, 130, 0, - 143, 160, 0, 0, 143, 121, 122, 140, 137, 144, - 128, 0, 0, 143, 121, 47, 140, 132, 145, 128, - 0, 143, 48, 147, 0, 143, 55, 97, 148, 0, - 0, 53, 0, 52, 0, 50, 97, 146, 0, 51, - 97, 4, 0, 49, 97, 24, 0, 102, 149, 104, - 0, 149, 98, 24, 0, 24, 0, 0, 22, 0, - 24, 0, 150, 0, 0, 132, 151, 0, 153, 98, - 152, 0, 152, 0, 153, 0, 153, 98, 37, 0, - 37, 0, 0, 123, 130, 150, 100, 154, 101, 127, - 124, 0, 29, 0, 107, 0, 122, 155, 156, 0, - 30, 0, 108, 0, 166, 158, 0, 0, 31, 161, - 155, 0, 3, 0, 4, 0, 7, 0, 27, 0, - 28, 0, 38, 0, 39, 0, 26, 0, 105, 139, - 106, 0, 138, 0, 111, 0, 150, 0, 163, 0, - 162, 0, 132, 164, 0, 166, 167, 0, 157, 167, - 0, 168, 121, 169, 0, 168, 171, 0, 0, 23, - 0, 62, 165, 0, 62, 8, 0, 63, 21, 164, - 0, 63, 9, 164, 98, 21, 164, 98, 21, 164, - 0, 64, 119, 164, 98, 21, 164, 102, 170, 104, - 0, 64, 119, 164, 98, 21, 164, 102, 104, 0, - 65, 123, 130, 164, 100, 174, 101, 36, 21, 164, - 66, 21, 164, 0, 66, 0, 67, 0, 170, 119, - 162, 98, 21, 164, 0, 119, 162, 98, 21, 164, - 0, 121, 176, 0, 132, 102, 164, 98, 164, 104, - 0, 172, 98, 102, 164, 98, 164, 104, 0, 165, - 0, 173, 98, 165, 0, 173, 0, 0, 57, 56, - 0, 56, 0, 113, 132, 164, 98, 164, 0, 114, - 132, 164, 98, 164, 0, 115, 132, 164, 98, 164, - 0, 46, 165, 0, 116, 165, 98, 165, 0, 89, - 165, 36, 132, 0, 90, 165, 98, 165, 98, 165, - 0, 93, 165, 98, 132, 0, 95, 165, 98, 132, - 0, 96, 165, 98, 132, 0, 94, 165, 98, 165, - 0, 88, 172, 0, 175, 123, 130, 164, 100, 174, - 101, 0, 179, 0, 98, 173, 0, 0, 35, 0, - 0, 82, 132, 125, 0, 82, 132, 98, 15, 164, - 125, 0, 83, 132, 125, 0, 83, 132, 98, 15, - 164, 125, 0, 84, 165, 0, 178, 85, 132, 164, - 0, 178, 86, 165, 98, 132, 164, 0, 87, 132, - 164, 177, 0 -}; +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) -#endif +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 991, 992, 999, 1000, 1009, 1009, 1009, 1009, 1009, 1010, - 1010, 1010, 1011, 1011, 1011, 1011, 1011, 1011, 1013, 1013, - 1017, 1017, 1017, 1017, 1018, 1018, 1018, 1018, 1019, 1019, - 1020, 1020, 1023, 1026, 1030, 1030, 1031, 1032, 1033, 1036, - 1036, 1037, 1038, 1039, 1048, 1048, 1054, 1054, 1062, 1069, - 1069, 1075, 1075, 1077, 1081, 1094, 1094, 1095, 1095, 1097, - 1106, 1106, 1106, 1106, 1106, 1106, 1106, 1107, 1107, 1107, - 1107, 1107, 1107, 1108, 1111, 1114, 1120, 1127, 1139, 1143, - 1154, 1163, 1166, 1174, 1178, 1183, 1184, 1187, 1190, 1200, - 1225, 1238, 1266, 1291, 1311, 1323, 1332, 1336, 1395, 1401, - 1409, 1414, 1419, 1422, 1425, 1432, 1442, 1473, 1480, 1501, - 1511, 1516, 1523, 1533, 1536, 1543, 1543, 1553, 1560, 1564, - 1567, 1570, 1583, 1603, 1605, 1608, 1611, 1615, 1618, 1620, - 1622, 1627, 1628, 1630, 1633, 1641, 1646, 1648, 1652, 1656, - 1664, 1664, 1665, 1665, 1667, 1673, 1678, 1684, 1687, 1692, - 1696, 1700, 1786, 1786, 1788, 1796, 1796, 1798, 1802, 1802, - 1811, 1814, 1817, 1820, 1823, 1826, 1829, 1832, 1835, 1859, - 1866, 1869, 1874, 1874, 1880, 1884, 1887, 1895, 1904, 1908, - 1918, 1929, 1932, 1935, 1938, 1941, 1955, 1959, 2012, 2015, - 2021, 2029, 2039, 2046, 2051, 2058, 2062, 2068, 2068, 2070, - 2073, 2079, 2091, 2102, 2112, 2124, 2131, 2138, 2145, 2150, - 2169, 2191, 2199, 2213, 2270, 2276, 2278, 2282, 2285, 2291, - 2295, 2299, 2303, 2307, 2314, 2324, 2337 -}; #endif - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","ESINT64VAL", -"EUINT64VAL","SINTVAL","UINTVAL","FPVAL","VOID","BOOL","SBYTE","UBYTE","SHORT", -"USHORT","INT","UINT","LONG","ULONG","FLOAT","DOUBLE","TYPE","LABEL","VAR_ID", -"LABELSTR","STRINGCONSTANT","IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK", -"BEGINTOK","ENDTOK","DECLARE","GLOBAL","CONSTANT","SECTION","VOLATILE","TO", -"DOTDOTDOT","NULL_TOK","UNDEF","CONST","INTERNAL","LINKONCE","WEAK","APPENDING", -"OPAQUE","NOT","EXTERNAL","TARGET","TRIPLE","ENDIAN","POINTERSIZE","LITTLE", -"BIG","ALIGN","DEPLIBS","CALL","TAIL","CC_TOK","CCC_TOK","FASTCC_TOK","COLDCC_TOK", -"RET","BR","SWITCH","INVOKE","UNWIND","UNREACHABLE","ADD","SUB","MUL","DIV", -"REM","AND","OR","XOR","SETLE","SETGE","SETLT","SETGT","SETEQ","SETNE","MALLOC", -"ALLOCA","FREE","LOAD","STORE","GETELEMENTPTR","PHI_TOK","CAST","SELECT","SHL", -"SHR","VAARG","EXTRACTELEMENT","VAARG_old","VANEXT_old","'='","','","'\\\\'", -"'('","')'","'['","'x'","']'","'<'","'>'","'{'","'}'","'*'","'c'","INTVAL","EINT64VAL", -"ArithmeticOps","LogicalOps","SetCondOps","ShiftOps","SIntType","UIntType","IntType", -"FPType","OptAssign","OptLinkage","OptCallingConv","OptAlign","OptCAlign","SectionString", -"OptSection","GlobalVarAttributes","GlobalVarAttribute","TypesV","UpRTypesV", -"Types","PrimType","UpRTypes","TypeListI","ArgTypeListI","ConstVal","ConstExpr", -"ConstVector","GlobalType","Module","FunctionList","ConstPool","@1","@2","BigOrLittle", -"TargetDefinition","LibrariesDefinition","LibList","Name","OptName","ArgVal", -"ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader","END","Function", -"FunctionProto","@3","ConstValueRef","SymbolicValueRef","ValueRef","ResolvedVal", -"BasicBlockList","BasicBlock","InstructionList","BBTerminatorInst","JumpTable", -"Inst","PHIList","ValueRefList","ValueRefListE","OptTailCall","InstVal","IndexList", -"OptVolatile","MemoryInst", NULL -}; +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; #endif -static const short yyr1[] = { 0, - 111, 111, 112, 112, 113, 113, 113, 113, 113, 114, - 114, 114, 115, 115, 115, 115, 115, 115, 116, 116, - 117, 117, 117, 117, 118, 118, 118, 118, 119, 119, - 120, 120, 121, 121, 122, 122, 122, 122, 122, 123, - 123, 123, 123, 123, 124, 124, 125, 125, 126, 127, - 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, - 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, - 133, 133, 133, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 135, 135, 136, 136, 136, 136, 137, - 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, - 137, 137, 137, 137, 137, 138, 138, 138, 138, 138, - 138, 138, 138, 139, 139, 140, 140, 141, 142, 142, - 142, 142, 143, 143, 144, 143, 145, 143, 143, 143, - 143, 146, 146, 147, 147, 147, 148, 149, 149, 149, - 150, 150, 151, 151, 152, 153, 153, 154, 154, 154, - 154, 155, 156, 156, 157, 158, 158, 159, 161, 160, - 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, - 163, 163, 164, 164, 165, 166, 166, 167, 168, 168, - 168, 169, 169, 169, 169, 169, 169, 169, 169, 169, - 170, 170, 171, 172, 172, 173, 173, 174, 174, 175, - 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 177, 177, 178, 178, 179, - 179, 179, 179, 179, 179, 179, 179 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1236 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 111 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 70 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 228 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 454 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 351 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 100, 101, 109, 2, 98, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 105, 97, 106, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 102, 99, 104, 2, 2, 2, 2, 2, 110, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 103, 2, 2, 107, 2, 108, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96 }; -static const short yyr2[] = { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 2, 0, 2, 0, 3, 2, 0, - 1, 0, 3, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 4, 5, 5, - 3, 2, 2, 1, 3, 1, 3, 1, 0, 4, - 3, 3, 4, 4, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 6, 5, 8, 6, 6, - 6, 6, 6, 3, 1, 1, 1, 1, 2, 2, - 2, 1, 4, 2, 0, 7, 0, 7, 3, 4, - 0, 1, 1, 3, 3, 3, 3, 3, 1, 0, - 1, 1, 1, 0, 2, 3, 1, 1, 3, 1, - 0, 8, 1, 1, 3, 1, 1, 2, 0, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 2, 2, 2, 3, 2, 0, - 1, 2, 2, 3, 9, 9, 8, 13, 1, 1, - 6, 5, 2, 6, 7, 1, 3, 1, 0, 2, - 1, 5, 5, 5, 2, 4, 4, 6, 4, 4, - 4, 4, 2, 7, 1, 2, 0, 1, 0, 3, - 6, 3, 6, 2, 4, 6, 4 +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, + 59, 61, 63, 65, 67, 70, 71, 73, 75, 77, + 79, 80, 81, 83, 85, 87, 90, 91, 94, 95, + 99, 102, 103, 105, 106, 110, 112, 115, 117, 119, + 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, + 141, 143, 145, 147, 149, 151, 153, 155, 157, 160, + 165, 171, 177, 181, 184, 187, 189, 193, 195, 199, + 201, 202, 207, 211, 215, 220, 225, 229, 232, 235, + 238, 241, 244, 247, 250, 253, 256, 259, 266, 272, + 281, 288, 295, 302, 309, 316, 320, 322, 324, 326, + 328, 331, 334, 337, 339, 344, 347, 348, 356, 357, + 365, 369, 374, 375, 377, 379, 383, 387, 391, 395, + 399, 401, 402, 404, 406, 408, 409, 412, 416, 418, + 420, 424, 426, 427, 436, 438, 440, 444, 446, 448, + 451, 452, 456, 458, 460, 462, 464, 466, 468, 470, + 472, 476, 478, 480, 482, 484, 486, 489, 492, 495, + 499, 502, 503, 505, 508, 511, 515, 525, 535, 544, + 558, 560, 562, 569, 575, 578, 585, 593, 595, 599, + 601, 602, 605, 607, 613, 619, 625, 628, 633, 638, + 645, 650, 655, 660, 665, 668, 676, 678, 681, 682, + 684, 685, 689, 696, 700, 707, 710, 715, 722 }; -static const short yydefact[] = { 131, - 39, 122, 121, 159, 35, 36, 37, 38, 40, 180, - 119, 120, 180, 141, 142, 0, 0, 39, 0, 124, - 40, 0, 41, 42, 43, 0, 0, 181, 177, 34, - 156, 157, 158, 176, 0, 0, 0, 129, 0, 0, - 0, 0, 33, 160, 44, 1, 2, 57, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 0, 0, 0, 0, 171, 0, 0, 56, - 75, 60, 172, 76, 153, 154, 155, 219, 179, 0, - 0, 0, 140, 130, 123, 116, 117, 0, 0, 77, - 0, 0, 59, 82, 84, 0, 0, 89, 83, 218, - 0, 201, 0, 0, 0, 0, 40, 189, 190, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 178, 40, 193, 0, 215, 136, 133, 132, 134, 135, - 139, 0, 127, 61, 62, 63, 64, 65, 66, 67, - 68, 69, 70, 71, 0, 0, 0, 0, 125, 0, - 0, 0, 81, 151, 88, 86, 0, 0, 205, 200, - 183, 182, 0, 0, 24, 28, 23, 27, 22, 26, - 21, 25, 29, 30, 0, 0, 47, 47, 224, 0, - 0, 213, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 137, 52, 103, 104, - 3, 4, 101, 102, 105, 100, 96, 97, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 99, 98, 52, 58, 58, 85, 150, 144, 147, 148, - 0, 0, 78, 161, 162, 163, 168, 164, 165, 166, - 167, 0, 170, 174, 173, 175, 0, 184, 0, 0, - 0, 220, 0, 222, 217, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 138, 0, 128, 0, 0, 0, 0, 91, 115, 0, - 0, 95, 0, 92, 0, 0, 0, 0, 126, 79, - 80, 143, 145, 0, 50, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 227, 0, 0, 207, 0, 209, - 212, 210, 211, 0, 0, 0, 206, 0, 225, 0, - 0, 0, 54, 52, 217, 0, 0, 0, 0, 90, - 93, 94, 0, 0, 0, 0, 149, 146, 51, 45, - 169, 0, 0, 199, 47, 48, 47, 196, 216, 0, - 0, 0, 202, 203, 204, 199, 0, 49, 55, 53, - 0, 0, 0, 0, 114, 0, 0, 0, 0, 0, - 152, 0, 0, 198, 0, 0, 221, 223, 0, 0, - 0, 208, 0, 226, 107, 0, 0, 0, 0, 0, - 0, 0, 46, 0, 0, 0, 197, 194, 0, 214, - 106, 0, 113, 109, 110, 111, 112, 0, 187, 0, - 0, 0, 195, 0, 185, 0, 186, 0, 0, 108, - 0, 0, 0, 0, 0, 0, 192, 0, 0, 191, - 188, 0, 0, 0 +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short yyrhs[] = +{ + 142, 0, -1, 5, -1, 6, -1, 3, -1, 4, + -1, 68, -1, 69, -1, 70, -1, 71, -1, 72, + -1, 73, -1, 74, -1, 75, -1, 76, -1, 77, + -1, 78, -1, 79, -1, 80, -1, 81, -1, 91, + -1, 92, -1, 16, -1, 14, -1, 12, -1, 10, + -1, 17, -1, 15, -1, 13, -1, 11, -1, 118, + -1, 119, -1, 18, -1, 19, -1, 151, 97, -1, + -1, 41, -1, 42, -1, 43, -1, 44, -1, -1, + -1, 59, -1, 60, -1, 61, -1, 58, 4, -1, + -1, 54, 4, -1, -1, 98, 54, 4, -1, 34, + 24, -1, -1, 127, -1, -1, 98, 130, 129, -1, + 127, -1, 54, 4, -1, 133, -1, 8, -1, 135, + -1, 8, -1, 135, -1, 9, -1, 10, -1, 11, + -1, 12, -1, 13, -1, 14, -1, 15, -1, 16, + -1, 17, -1, 18, -1, 19, -1, 20, -1, 21, + -1, 45, -1, 134, -1, 164, -1, 99, 4, -1, + 132, 100, 137, 101, -1, 102, 4, 103, 135, 104, + -1, 105, 4, 103, 135, 106, -1, 107, 136, 108, + -1, 107, 108, -1, 135, 109, -1, 135, -1, 136, + 98, 135, -1, 136, -1, 136, 98, 37, -1, 37, + -1, -1, 133, 102, 140, 104, -1, 133, 102, 104, + -1, 133, 110, 24, -1, 133, 105, 140, 106, -1, + 133, 107, 140, 108, -1, 133, 107, 108, -1, 133, + 38, -1, 133, 39, -1, 133, 164, -1, 133, 139, + -1, 133, 26, -1, 118, 113, -1, 119, 4, -1, + 9, 27, -1, 9, 28, -1, 121, 7, -1, 89, + 100, 138, 36, 133, 101, -1, 87, 100, 138, 178, + 101, -1, 90, 100, 138, 98, 138, 98, 138, 101, + -1, 114, 100, 138, 98, 138, 101, -1, 115, 100, + 138, 98, 138, 101, -1, 116, 100, 138, 98, 138, + 101, -1, 117, 100, 138, 98, 138, 101, -1, 94, + 100, 138, 98, 138, 101, -1, 140, 98, 138, -1, + 138, -1, 32, -1, 33, -1, 143, -1, 143, 160, + -1, 143, 161, -1, 143, 25, -1, 144, -1, 144, + 122, 20, 131, -1, 144, 161, -1, -1, 144, 122, + 123, 141, 138, 145, 129, -1, -1, 144, 122, 47, + 141, 133, 146, 129, -1, 144, 48, 148, -1, 144, + 55, 97, 149, -1, -1, 53, -1, 52, -1, 50, + 97, 147, -1, 51, 97, 4, -1, 49, 97, 24, + -1, 102, 150, 104, -1, 150, 98, 24, -1, 24, + -1, -1, 22, -1, 24, -1, 151, -1, -1, 133, + 152, -1, 154, 98, 153, -1, 153, -1, 154, -1, + 154, 98, 37, -1, 37, -1, -1, 124, 131, 151, + 100, 155, 101, 128, 125, -1, 29, -1, 107, -1, + 123, 156, 157, -1, 30, -1, 108, -1, 167, 159, + -1, -1, 31, 162, 156, -1, 3, -1, 4, -1, + 7, -1, 27, -1, 28, -1, 38, -1, 39, -1, + 26, -1, 105, 140, 106, -1, 139, -1, 112, -1, + 151, -1, 164, -1, 163, -1, 133, 165, -1, 167, + 168, -1, 158, 168, -1, 169, 122, 170, -1, 169, + 172, -1, -1, 23, -1, 62, 166, -1, 62, 8, + -1, 63, 21, 165, -1, 63, 9, 165, 98, 21, + 165, 98, 21, 165, -1, 64, 120, 165, 98, 21, + 165, 102, 171, 104, -1, 64, 120, 165, 98, 21, + 165, 102, 104, -1, 65, 124, 131, 165, 100, 175, + 101, 36, 21, 165, 66, 21, 165, -1, 66, -1, + 67, -1, 171, 120, 163, 98, 21, 165, -1, 120, + 163, 98, 21, 165, -1, 122, 177, -1, 133, 102, + 165, 98, 165, 104, -1, 173, 98, 102, 165, 98, + 165, 104, -1, 166, -1, 174, 98, 166, -1, 174, + -1, -1, 57, 56, -1, 56, -1, 114, 133, 165, + 98, 165, -1, 115, 133, 165, 98, 165, -1, 116, + 133, 165, 98, 165, -1, 46, 166, -1, 117, 166, + 98, 166, -1, 89, 166, 36, 133, -1, 90, 166, + 98, 166, 98, 166, -1, 93, 166, 98, 133, -1, + 95, 166, 98, 133, -1, 96, 166, 98, 133, -1, + 94, 166, 98, 166, -1, 88, 173, -1, 176, 124, + 131, 165, 100, 175, 101, -1, 180, -1, 98, 174, + -1, -1, 35, -1, -1, 82, 133, 126, -1, 82, + 133, 98, 15, 165, 126, -1, 83, 133, 126, -1, + 83, 133, 98, 15, 165, 126, -1, 84, 166, -1, + 179, 85, 133, 165, -1, 179, 86, 166, 98, 133, + 165, -1, 87, 133, 165, 178, -1 }; -static const short yydefgoto[] = { 67, - 223, 237, 238, 239, 240, 165, 166, 195, 167, 18, - 9, 26, 391, 272, 343, 360, 293, 344, 68, 69, - 168, 71, 72, 96, 177, 299, 263, 300, 88, 452, - 1, 2, 243, 218, 149, 38, 84, 152, 73, 313, - 249, 250, 251, 27, 77, 10, 33, 11, 12, 21, - 264, 74, 266, 368, 13, 29, 30, 141, 431, 79, - 202, 394, 395, 142, 143, 325, 144, 145 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 996, 996, 997, 1004, 1005, 1014, 1014, 1014, 1014, + 1014, 1015, 1015, 1015, 1016, 1016, 1016, 1016, 1016, 1016, + 1018, 1018, 1022, 1022, 1022, 1022, 1023, 1023, 1023, 1023, + 1024, 1024, 1025, 1025, 1028, 1031, 1035, 1036, 1037, 1038, + 1039, 1041, 1042, 1043, 1044, 1045, 1053, 1054, 1059, 1060, + 1067, 1074, 1075, 1080, 1081, 1082, 1086, 1099, 1099, 1100, + 1100, 1102, 1111, 1111, 1111, 1111, 1111, 1111, 1111, 1112, + 1112, 1112, 1112, 1112, 1112, 1113, 1116, 1119, 1125, 1132, + 1144, 1148, 1159, 1168, 1171, 1179, 1183, 1188, 1189, 1192, + 1195, 1205, 1230, 1243, 1271, 1296, 1316, 1328, 1337, 1341, + 1400, 1406, 1414, 1419, 1424, 1427, 1430, 1437, 1447, 1478, + 1485, 1506, 1516, 1521, 1528, 1538, 1541, 1548, 1548, 1558, + 1565, 1569, 1572, 1575, 1588, 1608, 1610, 1610, 1616, 1616, + 1623, 1625, 1627, 1632, 1633, 1635, 1638, 1646, 1651, 1653, + 1657, 1661, 1669, 1669, 1670, 1670, 1672, 1678, 1683, 1689, + 1692, 1697, 1701, 1705, 1791, 1791, 1793, 1801, 1801, 1803, + 1807, 1807, 1816, 1819, 1822, 1825, 1828, 1831, 1834, 1837, + 1840, 1864, 1871, 1874, 1879, 1879, 1885, 1889, 1892, 1900, + 1909, 1913, 1923, 1934, 1937, 1940, 1943, 1946, 1960, 1964, + 2017, 2020, 2026, 2034, 2044, 2051, 2056, 2063, 2067, 2073, + 2073, 2075, 2078, 2084, 2096, 2107, 2117, 2129, 2136, 2143, + 2150, 2155, 2174, 2196, 2204, 2218, 2275, 2281, 2283, 2287, + 2290, 2296, 2300, 2304, 2308, 2312, 2319, 2329, 2342 }; +#endif -static const short yypact[] = {-32768, - 41, 181,-32768,-32768,-32768,-32768,-32768,-32768, 62, 12, --32768,-32768, -14,-32768,-32768, 100, -8, 49, 0,-32768, - 62, 38,-32768,-32768,-32768, 979, -19,-32768,-32768, 112, --32768,-32768,-32768,-32768, 8, 27, 68,-32768, 36, 979, - -13, -13,-32768,-32768,-32768,-32768,-32768, 69,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 169, 171, 173, 491,-32768, 112, 78,-32768, --32768, -82,-32768,-32768,-32768,-32768,-32768, 1140,-32768, 156, - 24, 177, 158,-32768,-32768,-32768,-32768, 1017, 1055,-32768, - 81, 83,-32768,-32768, -82, -77, 90, 789,-32768,-32768, - 1017,-32768, 136, 1093, 4, 116, 62,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 1017, 1017, 1017, 1017, 1017, 1017, 1017, --32768,-32768, 1017, 1017, 1017, 1017, 1017, 1017, 1017, 1017, --32768, 62,-32768, 59,-32768,-32768,-32768,-32768,-32768,-32768, --32768, -24,-32768, 126, 152, 189, 155, 190, 157, 191, - 160, 192, 193, 195, 168, 194, 197, 360,-32768, 1017, - 1017, 1017,-32768, 827,-32768, 101, 105, 610,-32768,-32768, - 69,-32768, 610, 610,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768, 610, 979, 113, 117,-32768, 610, - 114, 119, 196, 128, 132, 133, 137, 139, 610, 610, - 610, 140, 979, 1017, 1017, 210,-32768, 141,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 142, 143, - 144, 147, 865, 1055, 567, 216, 148, 149, 151, 159, --32768,-32768, 141, 33, 37, -82,-32768, 112,-32768, 162, - 163, 903,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768, 1055,-32768,-32768,-32768,-32768, 165,-32768, 167, 610, - 7,-32768, 9,-32768, 170, 610, 164, 1017, 1017, 1017, - 1017, 1017, 1017, 172, 174, 175, 1017, 610, 610, 176, --32768, 52,-32768, 1055, 1055, 1055, 1055,-32768,-32768, -17, - -83,-32768, -72,-32768, 1055, 1055, 1055, 1055,-32768,-32768, --32768,-32768,-32768, 941, 207,-32768, -33, 237, 246, 179, - 610, 265, 610, 1017,-32768, 183, 610,-32768, 184,-32768, --32768,-32768,-32768, 610, 610, 610,-32768, 185,-32768, 1017, - 247, 271,-32768, 141, 170, 241, 188, 208, 1055,-32768, --32768,-32768, 209, 211, 213, 215,-32768,-32768,-32768, 229, --32768, 610, 610, 1017, 217,-32768, 217,-32768, 219, 610, - 220, 1017,-32768,-32768,-32768, 1017, 610,-32768,-32768,-32768, - 186, 1017, 1055, 1055,-32768, 1055, 1055, 1055, 1055, 285, --32768, 224, 206, 219, 222, 236,-32768,-32768, 1017, 221, - 610,-32768, 223,-32768,-32768, 228, 235, 238, 239, 240, - 242, 243,-32768, 273, 35, 259,-32768,-32768, 232,-32768, --32768, 1055,-32768,-32768,-32768,-32768,-32768, 610,-32768, 691, - 43, 316,-32768, 244,-32768, 249,-32768, 691, 610,-32768, - 321, 250, 283, 610, 330, 331,-32768, 610, 610,-32768, --32768, 353, 354,-32768 +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL", + "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT", + "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL", + "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", + "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK", + "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO", + "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE", + "WEAK", "APPENDING", "OPAQUE", "NOT", "EXTERNAL", "TARGET", "TRIPLE", + "ENDIAN", "POINTERSIZE", "LITTLE", "BIG", "ALIGN", "DEPLIBS", "CALL", + "TAIL", "CC_TOK", "CCC_TOK", "FASTCC_TOK", "COLDCC_TOK", "RET", "BR", + "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", "MUL", "DIV", + "REM", "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", + "SETNE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", + "PHI_TOK", "CAST", "SELECT", "SHL", "SHR", "VAARG", "EXTRACTELEMENT", + "VAARG_old", "VANEXT_old", "'='", "','", "'\\\\'", "'('", "')'", "'['", + "'x'", "']'", "'<'", "'>'", "'{'", "'}'", "'*'", "'c'", "$accept", + "INTVAL", "EINT64VAL", "ArithmeticOps", "LogicalOps", "SetCondOps", + "ShiftOps", "SIntType", "UIntType", "IntType", "FPType", "OptAssign", + "OptLinkage", "OptCallingConv", "OptAlign", "OptCAlign", "SectionString", + "OptSection", "GlobalVarAttributes", "GlobalVarAttribute", "TypesV", + "UpRTypesV", "Types", "PrimType", "UpRTypes", "TypeListI", + "ArgTypeListI", "ConstVal", "ConstExpr", "ConstVector", "GlobalType", + "Module", "FunctionList", "ConstPool", "@1", "@2", "BigOrLittle", + "TargetDefinition", "LibrariesDefinition", "LibList", "Name", "OptName", + "ArgVal", "ArgListH", "ArgList", "FunctionHeaderH", "BEGIN", + "FunctionHeader", "END", "Function", "FunctionProto", "@3", + "ConstValueRef", "SymbolicValueRef", "ValueRef", "ResolvedVal", + "BasicBlockList", "BasicBlock", "InstructionList", "BBTerminatorInst", + "JumpTable", "Inst", "PHIList", "ValueRefList", "ValueRefListE", + "OptTailCall", "InstVal", "IndexList", "OptVolatile", "MemoryInst", 0 }; +#endif -static const short yypgoto[] = {-32768, --32768, 277, 279, 281, 282, -105, -103, -403,-32768, 332, - 343, -78,-32768, -191, 48,-32768, -226,-32768, -34,-32768, - -26,-32768, -55, 266,-32768, -87, 199, -167, 326,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 2,-32768, - 55,-32768,-32768, 349,-32768,-32768,-32768,-32768, 369,-32768, - -359, -43, 121, -96,-32768, 359,-32768,-32768,-32768,-32768, --32768, 50, -1,-32768,-32768, 31,-32768,-32768 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 61, 44, 92, + 40, 41, 91, 120, 93, 60, 62, 123, 125, 42, + 99 }; +# endif +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 111, 112, 112, 113, 113, 114, 114, 114, 114, + 114, 115, 115, 115, 116, 116, 116, 116, 116, 116, + 117, 117, 118, 118, 118, 118, 119, 119, 119, 119, + 120, 120, 121, 121, 122, 122, 123, 123, 123, 123, + 123, 124, 124, 124, 124, 124, 125, 125, 126, 126, + 127, 128, 128, 129, 129, 130, 130, 131, 131, 132, + 132, 133, 134, 134, 134, 134, 134, 134, 134, 134, + 134, 134, 134, 134, 134, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 136, 136, 137, 137, 137, + 137, 138, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 138, 138, 138, 138, 138, 139, 139, 139, + 139, 139, 139, 139, 139, 140, 140, 141, 141, 142, + 143, 143, 143, 143, 144, 144, 145, 144, 146, 144, + 144, 144, 144, 147, 147, 148, 148, 148, 149, 150, + 150, 150, 151, 151, 152, 152, 153, 154, 154, 155, + 155, 155, 155, 156, 157, 157, 158, 159, 159, 160, + 162, 161, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 164, 164, 165, 165, 166, 167, 167, 168, + 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, + 170, 170, 171, 171, 172, 173, 173, 174, 174, 175, + 175, 176, 176, 177, 177, 177, 177, 177, 177, 177, + 177, 177, 177, 177, 177, 177, 177, 178, 178, 179, + 179, 180, 180, 180, 180, 180, 180, 180, 180 +}; -#define YYLAST 1236 - +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 2, 0, 2, 0, 3, + 2, 0, 1, 0, 3, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, + 5, 5, 3, 2, 2, 1, 3, 1, 3, 1, + 0, 4, 3, 3, 4, 4, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 6, 5, 8, + 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, + 2, 2, 2, 1, 4, 2, 0, 7, 0, 7, + 3, 4, 0, 1, 1, 3, 3, 3, 3, 3, + 1, 0, 1, 1, 1, 0, 2, 3, 1, 1, + 3, 1, 0, 8, 1, 1, 3, 1, 1, 2, + 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 2, 2, 2, 3, + 2, 0, 1, 2, 2, 3, 9, 9, 8, 13, + 1, 1, 6, 5, 2, 6, 7, 1, 3, 1, + 0, 2, 1, 5, 5, 5, 2, 4, 4, 6, + 4, 4, 4, 4, 2, 7, 1, 2, 0, 1, + 0, 3, 6, 3, 6, 2, 4, 6, 4 +}; -static const short yytable[] = { 70, - 193, 169, 194, 19, 179, 85, 274, 182, 28, 75, - 95, 430, 183, 70, 349, 31, 309, -58, 86, 87, - 172, 321, 351, 323, 184, 349, 99, 438, 196, 199, - 173, 19, 203, 204, 28, 352, 205, 206, 207, 208, - -118, 45, 95, 212, 185, 186, 187, 188, 189, 190, - 191, 192, 185, 186, 187, 188, 189, 190, 191, 192, - 322, 153, 322, 213, 349, 3, 301, 303, 40, 97, - 436, 4, 361, 216, 178, 147, 148, 178, 442, 217, - 349, 5, 6, 7, 8, 341, 350, 76, 39, 5, - 6, 7, 8, 32, 317, 41, 43, 197, 198, 178, - 200, 201, 178, 178, 80, 342, 178, 178, 178, 178, - 209, 210, 211, 178, 244, 245, 246, 380, 290, 22, - 23, 24, 25, 81, 242, 185, 186, 187, 188, 189, - 190, 191, 192, 14, 265, 15, 310, 83, 429, 265, - 265, 99, 311, 214, 215, 99, 437, 248, 35, 36, - 37, 265, 219, 220, -24, -24, 265, -23, -23, -22, - -22, 270, -21, -21, 82, 265, 265, 265, -59, 70, - 221, 222, 90, 397, 91, 398, 92, 98, 288, 146, - 150, 151, 329, 170, 331, 171, 70, 289, 178, 174, - 337, 180, -28, -27, -26, -25, 246, 224, 252, -31, - -34, -32, 14, 225, 15, 253, 345, 346, 347, 348, - 271, 4, -34, -34, 273, 276, 277, 353, 354, 355, - 356, -34, -34, -34, -34, 279, 265, -34, 16, 280, - 281, 278, 265, 291, 282, 17, 283, 287, 292, 304, - 341, 294, 295, 296, 265, 265, 297, 305, 306, 312, - 307, 328, 178, 330, 178, 332, 333, 362, 308, 314, - 178, 385, 318, 315, 319, 327, 363, 324, 366, 334, - 378, 335, 336, 340, 379, 402, 382, 265, 364, 265, - 370, 372, 390, 265, 376, 383, 405, 248, 413, 322, - 265, 265, 265, 428, 432, 407, 408, 178, 409, 410, - 411, 412, 417, 267, 268, 384, 386, 415, 387, 193, - 388, 194, 389, 377, 396, 269, 399, 401, 265, 265, - 275, 414, 416, 420, 418, 193, 265, 194, 421, 284, - 285, 286, 422, 265, 434, 433, 439, 178, 423, 424, - 425, 444, 426, 427, 440, 178, 441, 445, 446, 178, - 448, 449, 453, 454, 137, 406, 138, 265, 139, 140, - 42, 78, 359, 176, 46, 47, 241, 89, 358, 44, - 20, 34, 178, 369, 403, 381, 0, 0, 0, 0, - 0, 14, 0, 15, 265, 226, 0, 0, 0, 0, - 320, 0, 0, 0, 0, 265, 326, 227, 228, 0, - 265, 0, 0, 0, 265, 265, 0, 0, 338, 339, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 365, 0, 367, 0, 0, 229, 371, 230, 231, - 131, 132, 0, 232, 373, 374, 375, 0, 0, 0, - 0, 233, 0, 0, 234, 0, 235, 0, 0, 236, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 392, 393, 0, 0, 0, 0, 0, 0, - 400, 0, 0, 0, 0, 46, 47, 404, 93, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 14, 0, 15, 0, 0, 0, 0, 0, - 0, 419, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 435, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, - 0, 0, 0, 0, 447, 0, 0, 0, 450, 451, - 0, 46, 47, 0, 93, 154, 155, 156, 157, 158, - 159, 160, 161, 162, 163, 164, 60, 61, 14, 63, - 15, 0, 64, 0, 0, 65, 0, 66, 94, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 62, 254, 255, 46, 47, 256, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 14, 0, 15, 0, 257, 258, 259, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 260, 261, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 63, 0, 0, 64, 0, - 0, 65, 0, 66, 302, 0, 0, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 0, 0, 254, 255, 0, 229, 256, 230, 231, - 131, 132, 0, 232, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 262, 0, 257, 258, 259, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 260, 261, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 0, 0, 0, 0, 0, 229, 0, 230, - 231, 131, 132, 0, 232, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 47, 262, 93, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 14, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 175, 0, 0, 0, 0, - 0, 46, 47, 62, 93, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 14, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 247, 0, 0, 0, 0, 0, 46, - 47, 62, 93, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 60, 61, 14, 63, 15, 0, - 64, 0, 0, 65, 0, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 46, 47, 62, - 93, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 14, 63, 15, 0, 64, 0, - 0, 65, 0, 66, 0, 0, 0, 0, 0, 316, - 0, 0, 0, 0, 0, 46, 47, 62, 93, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 14, 63, 15, 0, 64, 0, 298, 65, - 0, 66, 0, 0, 0, 0, 0, 357, 0, 0, - 0, 0, 0, 46, 47, 62, 48, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 14, 63, 15, 0, 64, 0, 0, 65, 0, 66, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 46, 47, 62, 93, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 14, 63, - 15, 0, 64, 0, 0, 65, 0, 66, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, - 47, 62, 93, 154, 155, 156, 157, 158, 159, 160, - 161, 162, 163, 164, 60, 61, 14, 63, 15, 0, - 64, 0, 0, 65, 0, 66, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 46, 47, 62, - 181, 49, 50, 51, 52, 53, 54, 55, 56, 57, - 58, 59, 60, 61, 14, 63, 15, 0, 64, 0, - 0, 65, 0, 66, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 64, 0, 0, 65, - 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 100, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 101, 0, 0, 0, 0, - 0, 63, 0, 0, 64, 102, 103, 65, 0, 66, - 0, 104, 105, 106, 107, 108, 109, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 124, 125, 126, 0, 0, 127, 128, 129, 130, - 131, 132, 133, 134, 135, 136 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 132, 0, 40, 123, 1, 122, 160, 36, 37, 38, + 39, 41, 181, 120, 121, 181, 142, 143, 0, 0, + 40, 0, 125, 41, 0, 42, 43, 44, 0, 0, + 182, 178, 35, 157, 158, 159, 177, 0, 0, 0, + 130, 0, 0, 0, 0, 34, 161, 45, 2, 3, + 58, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 0, 0, 0, 0, 172, + 0, 0, 57, 76, 61, 173, 77, 154, 155, 156, + 220, 180, 0, 0, 0, 141, 131, 124, 117, 118, + 0, 0, 78, 0, 0, 60, 83, 85, 0, 0, + 90, 84, 219, 0, 202, 0, 0, 0, 0, 41, + 190, 191, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 179, 41, 194, 0, 216, 137, 134, + 133, 135, 136, 140, 0, 128, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 0, 0, 0, + 0, 126, 0, 0, 0, 82, 152, 89, 87, 0, + 0, 206, 201, 184, 183, 0, 0, 25, 29, 24, + 28, 23, 27, 22, 26, 30, 31, 0, 0, 48, + 48, 225, 0, 0, 214, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, + 53, 104, 105, 4, 5, 102, 103, 106, 101, 97, + 98, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 100, 99, 53, 59, 59, 86, 151, + 145, 148, 149, 0, 0, 79, 162, 163, 164, 169, + 165, 166, 167, 168, 0, 171, 175, 174, 176, 0, + 185, 0, 0, 0, 221, 0, 223, 218, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 139, 0, 129, 0, 0, 0, 0, + 92, 116, 0, 0, 96, 0, 93, 0, 0, 0, + 0, 127, 80, 81, 144, 146, 0, 51, 88, 0, + 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, + 208, 0, 210, 213, 211, 212, 0, 0, 0, 207, + 0, 226, 0, 0, 0, 55, 53, 218, 0, 0, + 0, 0, 91, 94, 95, 0, 0, 0, 0, 150, + 147, 52, 46, 170, 0, 0, 200, 48, 49, 48, + 197, 217, 0, 0, 0, 203, 204, 205, 200, 0, + 50, 56, 54, 0, 0, 0, 0, 115, 0, 0, + 0, 0, 0, 153, 0, 0, 199, 0, 0, 222, + 224, 0, 0, 0, 209, 0, 227, 108, 0, 0, + 0, 0, 0, 0, 0, 47, 0, 0, 0, 198, + 195, 0, 215, 107, 0, 114, 110, 111, 112, 113, + 0, 188, 0, 0, 0, 196, 0, 186, 0, 187, + 0, 0, 109, 0, 0, 0, 0, 0, 0, 193, + 0, 0, 192, 189 }; -static const short yycheck[] = { 26, - 106, 89, 106, 2, 101, 40, 198, 104, 23, 29, - 66, 415, 9, 40, 98, 30, 243, 100, 32, 33, - 98, 15, 106, 15, 21, 98, 109, 431, 107, 126, - 108, 30, 129, 130, 23, 108, 133, 134, 135, 136, - 0, 4, 98, 140, 10, 11, 12, 13, 14, 15, - 16, 17, 10, 11, 12, 13, 14, 15, 16, 17, - 54, 88, 54, 142, 98, 25, 234, 235, 20, 68, - 430, 31, 106, 98, 101, 52, 53, 104, 438, 104, - 98, 41, 42, 43, 44, 34, 104, 107, 97, 41, - 42, 43, 44, 108, 262, 47, 97, 124, 125, 126, - 127, 128, 129, 130, 97, 54, 133, 134, 135, 136, - 137, 138, 139, 140, 170, 171, 172, 344, 215, 58, - 59, 60, 61, 97, 168, 10, 11, 12, 13, 14, - 15, 16, 17, 22, 178, 24, 104, 102, 104, 183, - 184, 109, 106, 85, 86, 109, 104, 174, 49, 50, - 51, 195, 27, 28, 3, 4, 200, 3, 4, 3, - 4, 196, 3, 4, 97, 209, 210, 211, 100, 196, - 3, 4, 4, 365, 4, 367, 4, 100, 213, 24, - 4, 24, 279, 103, 281, 103, 213, 214, 215, 100, - 287, 56, 4, 4, 4, 4, 252, 4, 98, 7, - 20, 7, 22, 7, 24, 101, 294, 295, 296, 297, - 98, 31, 32, 33, 98, 102, 98, 305, 306, 307, - 308, 41, 42, 43, 44, 98, 270, 47, 48, 98, - 98, 36, 276, 24, 98, 55, 98, 98, 98, 24, - 34, 100, 100, 100, 288, 289, 100, 100, 100, 248, - 100, 278, 279, 280, 281, 282, 283, 21, 100, 98, - 287, 349, 98, 101, 98, 102, 21, 98, 4, 98, - 24, 98, 98, 98, 4, 372, 36, 321, 100, 323, - 98, 98, 54, 327, 100, 98, 101, 314, 4, 54, - 334, 335, 336, 21, 36, 383, 384, 324, 386, 387, - 388, 389, 399, 183, 184, 98, 98, 102, 98, 415, - 98, 415, 98, 340, 98, 195, 98, 98, 362, 363, - 200, 98, 101, 101, 104, 431, 370, 431, 101, 209, - 210, 211, 98, 377, 422, 104, 21, 364, 101, 101, - 101, 21, 101, 101, 101, 372, 98, 98, 66, 376, - 21, 21, 0, 0, 78, 382, 78, 401, 78, 78, - 18, 30, 315, 98, 5, 6, 168, 42, 314, 21, - 2, 13, 399, 324, 376, 345, -1, -1, -1, -1, - -1, 22, -1, 24, 428, 26, -1, -1, -1, -1, - 270, -1, -1, -1, -1, 439, 276, 38, 39, -1, - 444, -1, -1, -1, 448, 449, -1, -1, 288, 289, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 321, -1, 323, -1, -1, 87, 327, 89, 90, - 91, 92, -1, 94, 334, 335, 336, -1, -1, -1, - -1, 102, -1, -1, 105, -1, 107, -1, -1, 110, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 362, 363, -1, -1, -1, -1, -1, -1, - 370, -1, -1, -1, -1, 5, 6, 377, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, - -1, 401, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 428, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 439, - -1, -1, -1, -1, 444, -1, -1, -1, 448, 449, - -1, 5, 6, -1, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 99, - 24, -1, 102, -1, -1, 105, -1, 107, 108, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 45, 3, 4, 5, 6, 7, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 22, -1, 24, -1, 26, 27, 28, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 38, 39, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 99, -1, -1, 102, -1, - -1, 105, -1, 107, 108, -1, -1, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, -1, -1, 3, 4, -1, 87, 7, 89, 90, - 91, 92, -1, 94, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 105, -1, 26, 27, 28, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 38, 39, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, -1, -1, -1, -1, -1, 87, -1, 89, - 90, 91, 92, -1, 94, -1, -1, -1, -1, -1, - -1, -1, -1, 5, 6, 105, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, - -1, 5, 6, 45, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, - 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 37, -1, -1, -1, -1, -1, 5, - 6, 45, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 99, 24, -1, - 102, -1, -1, 105, -1, 107, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 5, 6, 45, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 99, 24, -1, 102, -1, - -1, 105, -1, 107, -1, -1, -1, -1, -1, 37, - -1, -1, -1, -1, -1, 5, 6, 45, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, 99, 24, -1, 102, -1, 104, 105, - -1, 107, -1, -1, -1, -1, -1, 37, -1, -1, - -1, -1, -1, 5, 6, 45, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 99, 24, -1, 102, -1, -1, 105, -1, 107, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 5, 6, 45, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, 99, - 24, -1, 102, -1, -1, 105, -1, 107, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, - 6, 45, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 99, 24, -1, - 102, -1, -1, 105, -1, 107, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 5, 6, 45, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, 99, 24, -1, 102, -1, - -1, 105, -1, 107, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 99, -1, -1, 102, -1, -1, 105, - -1, 107, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 35, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, - -1, 99, -1, -1, 102, 56, 57, 105, -1, 107, - -1, 62, 63, 64, 65, 66, 67, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, 82, 83, 84, -1, -1, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 69, 225, 239, 240, 241, 242, 167, 168, 197, + 169, 20, 11, 28, 393, 274, 345, 362, 295, 346, + 70, 71, 170, 73, 74, 98, 179, 301, 265, 302, + 90, 1, 2, 3, 245, 220, 151, 40, 86, 154, + 75, 315, 251, 252, 253, 29, 79, 12, 35, 13, + 14, 23, 266, 76, 268, 370, 15, 31, 32, 143, + 433, 81, 204, 396, 397, 144, 145, 327, 146, 147 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -408 +static const short yypact[] = +{ + -408, 21, 120, 181, -408, -408, -408, -408, -408, -408, + -408, 63, 1, -408, -408, -14, -408, -408, 87, -66, + 48, -23, -408, 63, 79, -408, -408, -408, 979, -22, + -408, -408, 62, -408, -408, -408, -408, -10, 37, 47, + -408, 44, 979, 64, 64, -408, -408, -408, -408, -408, + 65, -408, -408, -408, -408, -408, -408, -408, -408, -408, + -408, -408, -408, -408, -408, 165, 170, 172, 491, -408, + 62, 80, -408, -408, -82, -408, -408, -408, -408, -408, + 1140, -408, 157, 53, 178, 160, -408, -408, -408, -408, + 1017, 1055, -408, 83, 89, -408, -408, -82, -85, 90, + 789, -408, -408, 1017, -408, 137, 1093, 11, 116, 63, + -408, -408, -408, -408, -408, -408, -408, -408, -408, -408, + -408, -408, -408, -408, -408, -408, 1017, 1017, 1017, 1017, + 1017, 1017, 1017, -408, -408, 1017, 1017, 1017, 1017, 1017, + 1017, 1017, 1017, -408, 63, -408, 57, -408, -408, -408, + -408, -408, -408, -408, -62, -408, 122, 150, 190, 152, + 191, 155, 192, 168, 194, 193, 195, 175, 200, 199, + 360, -408, 1017, 1017, 1017, -408, 827, -408, 101, 110, + 610, -408, -408, 65, -408, 610, 610, -408, -408, -408, + -408, -408, -408, -408, -408, -408, -408, 610, 979, 117, + 118, -408, 610, 115, 128, 196, 132, 133, 136, 139, + 140, 610, 610, 610, 141, 979, 1017, 1017, 211, -408, + 142, -408, -408, -408, -408, -408, -408, -408, -408, -408, + -408, 143, 144, 147, 148, 865, 1055, 567, 217, 149, + 151, 158, 163, -408, -408, 142, -33, -39, -82, -408, + 62, -408, 162, 164, 903, -408, -408, -408, -408, -408, + -408, -408, -408, -408, 1055, -408, -408, -408, -408, 166, + -408, 169, 610, 7, -408, 10, -408, 171, 610, 173, + 1017, 1017, 1017, 1017, 1017, 1017, 174, 176, 179, 1017, + 610, 610, 183, -408, -19, -408, 1055, 1055, 1055, 1055, + -408, -408, -16, -29, -408, -79, -408, 1055, 1055, 1055, + 1055, -408, -408, -408, -408, -408, 941, 208, -408, -26, + 229, 245, 182, 610, 264, 610, 1017, -408, 185, 610, + -408, 187, -408, -408, -408, -408, 610, 610, 610, -408, + 186, -408, 1017, 246, 267, -408, 142, 171, 237, 189, + 197, 1055, -408, -408, -408, 209, 210, 213, 215, -408, + -408, -408, 225, -408, 610, 610, 1017, 219, -408, 219, + -408, 220, 610, 224, 1017, -408, -408, -408, 1017, 610, + -408, -408, -408, 188, 1017, 1055, 1055, -408, 1055, 1055, + 1055, 1055, 286, -408, 226, 204, 220, 214, 240, -408, + -408, 1017, 205, 610, -408, 222, -408, -408, 228, 227, + 232, 235, 236, 238, 239, -408, 320, 35, 306, -408, + -408, 241, -408, -408, 1055, -408, -408, -408, -408, -408, + 610, -408, 691, 43, 322, -408, 243, -408, 249, -408, + 691, 610, -408, 327, 251, 285, 610, 331, 332, -408, + 610, 610, -408, -408 +}; - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -408, -408, -408, 274, 275, 277, 279, -107, -105, -407, + -408, 328, 341, -81, -408, -194, 45, -408, -228, -408, + -38, -408, -28, -408, -57, 263, -408, -89, 198, -171, + 323, -408, -408, -408, -408, -408, -408, -408, -408, -408, + 9, -408, 54, -408, -408, 346, -408, -408, -408, -408, + 361, -408, -359, -45, 119, -98, -408, 356, -408, -408, + -408, -408, -408, 46, -4, -408, -408, 28, -408, -408 +}; - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -120 +static const short yytable[] = +{ + 72, 195, 171, 196, 87, 181, 276, 77, 184, 30, + 432, 97, 21, 174, 72, 343, 33, 311, -59, 351, + 185, 4, 323, 175, 30, 325, 440, 101, 198, 354, + 201, 41, 186, 205, 206, 344, 218, 207, 208, 209, + 210, 21, 219, 97, 214, 187, 188, 189, 190, 191, + 192, 193, 194, 187, 188, 189, 190, 191, 192, 193, + 194, 324, 155, 215, 324, 303, 305, 313, 42, 351, + 101, 312, 351, 438, 45, 180, 101, 353, 180, 99, + 363, 444, 351, 47, 16, 78, 17, 82, 352, 7, + 8, 9, 10, 319, 34, 43, 88, 89, 199, 200, + 180, 202, 203, 180, 180, 149, 150, 180, 180, 180, + 180, 211, 212, 213, 180, 246, 247, 248, 382, 292, + -119, 24, 25, 26, 27, 244, 187, 188, 189, 190, + 191, 192, 193, 194, 83, 267, 37, 38, 39, 431, + 267, 267, 216, 217, 84, 5, 85, 439, 250, 221, + 222, 6, 267, -25, -25, -24, -24, 267, -23, -23, + 272, 7, 8, 9, 10, -60, 267, 267, 267, 92, + 72, -22, -22, 399, 93, 400, 94, 290, 223, 224, + 100, 148, 152, 331, 153, 333, 172, 72, 291, 180, + 176, 339, 173, 182, -29, -28, -27, 248, -26, 254, + -32, -35, -33, 16, 226, 17, 227, 347, 348, 349, + 350, 255, 6, -35, -35, 273, 275, 278, 355, 356, + 357, 358, -35, -35, -35, -35, 279, 267, -35, 18, + 281, 282, 280, 267, 283, 293, 19, 284, 285, 289, + 294, 306, 343, 296, 297, 267, 267, 298, 299, 307, + 364, 308, 330, 180, 332, 180, 334, 335, 309, 314, + 316, 180, 387, 310, 320, 317, 365, 321, 368, 326, + 380, 381, 336, 384, 337, 329, 404, 338, 267, 392, + 267, 342, 366, 372, 267, 374, 378, 385, 250, 407, + 415, 267, 267, 267, 324, 386, 409, 410, 180, 411, + 412, 413, 414, 419, 269, 270, 417, 388, 389, 420, + 195, 390, 196, 391, 379, 418, 271, 398, 401, 267, + 267, 277, 403, 422, 416, 424, 195, 267, 196, 423, + 286, 287, 288, 425, 267, 436, 426, 427, 180, 428, + 429, 430, 434, 441, 442, 435, 180, 443, 446, 447, + 180, 448, 450, 451, 139, 140, 408, 141, 267, 142, + 80, 44, 361, 178, 22, 48, 49, 91, 243, 46, + 360, 36, 371, 180, 405, 383, 0, 0, 0, 0, + 0, 0, 16, 0, 17, 267, 228, 0, 0, 0, + 0, 322, 0, 0, 0, 0, 267, 328, 229, 230, + 0, 267, 0, 0, 0, 267, 267, 0, 0, 340, + 341, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 367, 0, 369, 0, 0, 231, 373, 232, + 233, 133, 134, 0, 234, 375, 376, 377, 0, 0, + 0, 0, 235, 0, 0, 236, 0, 237, 0, 0, + 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 394, 395, 0, 0, 0, 0, 0, + 0, 402, 0, 0, 0, 0, 48, 49, 406, 95, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 16, 0, 17, 0, 0, 0, 0, + 0, 0, 421, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 437, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 445, 0, 0, 0, 0, 449, 0, 0, 0, 452, + 453, 0, 48, 49, 0, 95, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 62, 63, 16, + 65, 17, 0, 66, 0, 0, 67, 0, 68, 96, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 64, 256, 257, 48, 49, 258, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 16, 0, 17, 0, 259, 260, 261, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 262, 263, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 66, + 0, 0, 67, 0, 68, 304, 0, 0, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 0, 0, 256, 257, 0, 231, 258, 232, + 233, 133, 134, 0, 234, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 264, 0, 259, 260, 261, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, + 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 0, 0, 0, 0, 0, 231, 0, + 232, 233, 133, 134, 0, 234, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 49, 264, 95, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 16, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 177, 0, 0, 0, + 0, 0, 48, 49, 64, 95, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 16, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 249, 0, 0, 0, 0, 0, + 48, 49, 64, 95, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 62, 63, 16, 65, 17, + 0, 66, 0, 0, 67, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 64, 95, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 16, 65, 17, 0, 66, + 0, 0, 67, 0, 68, 0, 0, 0, 0, 0, + 318, 0, 0, 0, 0, 0, 48, 49, 64, 95, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 16, 65, 17, 0, 66, 0, 300, + 67, 0, 68, 0, 0, 0, 0, 0, 359, 0, + 0, 0, 0, 0, 48, 49, 64, 50, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 16, 65, 17, 0, 66, 0, 0, 67, 0, + 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 48, 49, 64, 95, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 16, + 65, 17, 0, 66, 0, 0, 67, 0, 68, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 48, 49, 64, 95, 156, 157, 158, 159, 160, 161, + 162, 163, 164, 165, 166, 62, 63, 16, 65, 17, + 0, 66, 0, 0, 67, 0, 68, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 48, 49, + 64, 183, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 16, 65, 17, 0, 66, + 0, 0, 67, 0, 68, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 0, 66, 0, 0, + 67, 0, 68, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, + 0, 0, 65, 0, 0, 66, 104, 105, 67, 0, + 68, 0, 106, 107, 108, 109, 110, 111, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 126, 127, 128, 0, 0, 129, 130, 131, + 132, 133, 134, 135, 136, 137, 138 +}; - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ +static const short yycheck[] = +{ + 28, 108, 91, 108, 42, 103, 200, 29, 106, 23, + 417, 68, 3, 98, 42, 34, 30, 245, 100, 98, + 9, 0, 15, 108, 23, 15, 433, 109, 109, 108, + 128, 97, 21, 131, 132, 54, 98, 135, 136, 137, + 138, 32, 104, 100, 142, 10, 11, 12, 13, 14, + 15, 16, 17, 10, 11, 12, 13, 14, 15, 16, + 17, 54, 90, 144, 54, 236, 237, 106, 20, 98, + 109, 104, 98, 432, 97, 103, 109, 106, 106, 70, + 106, 440, 98, 4, 22, 107, 24, 97, 104, 41, + 42, 43, 44, 264, 108, 47, 32, 33, 126, 127, + 128, 129, 130, 131, 132, 52, 53, 135, 136, 137, + 138, 139, 140, 141, 142, 172, 173, 174, 346, 217, + 0, 58, 59, 60, 61, 170, 10, 11, 12, 13, + 14, 15, 16, 17, 97, 180, 49, 50, 51, 104, + 185, 186, 85, 86, 97, 25, 102, 104, 176, 27, + 28, 31, 197, 3, 4, 3, 4, 202, 3, 4, + 198, 41, 42, 43, 44, 100, 211, 212, 213, 4, + 198, 3, 4, 367, 4, 369, 4, 215, 3, 4, + 100, 24, 4, 281, 24, 283, 103, 215, 216, 217, + 100, 289, 103, 56, 4, 4, 4, 254, 4, 98, + 7, 20, 7, 22, 4, 24, 7, 296, 297, 298, + 299, 101, 31, 32, 33, 98, 98, 102, 307, 308, + 309, 310, 41, 42, 43, 44, 98, 272, 47, 48, + 98, 98, 36, 278, 98, 24, 55, 98, 98, 98, + 98, 24, 34, 100, 100, 290, 291, 100, 100, 100, + 21, 100, 280, 281, 282, 283, 284, 285, 100, 250, + 98, 289, 351, 100, 98, 101, 21, 98, 4, 98, + 24, 4, 98, 36, 98, 102, 374, 98, 323, 54, + 325, 98, 100, 98, 329, 98, 100, 98, 316, 101, + 4, 336, 337, 338, 54, 98, 385, 386, 326, 388, + 389, 390, 391, 401, 185, 186, 102, 98, 98, 104, + 417, 98, 417, 98, 342, 101, 197, 98, 98, 364, + 365, 202, 98, 101, 98, 98, 433, 372, 433, 101, + 211, 212, 213, 101, 379, 424, 101, 101, 366, 101, + 101, 21, 36, 21, 101, 104, 374, 98, 21, 98, + 378, 66, 21, 21, 80, 80, 384, 80, 403, 80, + 32, 20, 317, 100, 3, 5, 6, 44, 170, 23, + 316, 15, 326, 401, 378, 347, -1, -1, -1, -1, + -1, -1, 22, -1, 24, 430, 26, -1, -1, -1, + -1, 272, -1, -1, -1, -1, 441, 278, 38, 39, + -1, 446, -1, -1, -1, 450, 451, -1, -1, 290, + 291, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 323, -1, 325, -1, -1, 87, 329, 89, + 90, 91, 92, -1, 94, 336, 337, 338, -1, -1, + -1, -1, 102, -1, -1, 105, -1, 107, -1, -1, + 110, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 364, 365, -1, -1, -1, -1, -1, + -1, 372, -1, -1, -1, -1, 5, 6, 379, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, + -1, -1, 403, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 430, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 441, -1, -1, -1, -1, 446, -1, -1, -1, 450, + 451, -1, 5, 6, -1, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 99, 24, -1, 102, -1, -1, 105, -1, 107, 108, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 45, 3, 4, 5, 6, 7, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 22, -1, 24, -1, 26, 27, 28, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 38, 39, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 99, -1, -1, 102, + -1, -1, 105, -1, 107, 108, -1, -1, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, -1, -1, 3, 4, -1, 87, 7, 89, + 90, 91, 92, -1, 94, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 105, -1, 26, 27, 28, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 38, + 39, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, -1, -1, -1, -1, -1, 87, -1, + 89, 90, 91, 92, -1, 94, -1, -1, -1, -1, + -1, -1, -1, -1, 5, 6, 105, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, + -1, -1, 5, 6, 45, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + 5, 6, 45, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 99, 24, + -1, 102, -1, -1, 105, -1, 107, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, + 45, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 99, 24, -1, 102, + -1, -1, 105, -1, 107, -1, -1, -1, -1, -1, + 37, -1, -1, -1, -1, -1, 5, 6, 45, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, 99, 24, -1, 102, -1, 104, + 105, -1, 107, -1, -1, -1, -1, -1, 37, -1, + -1, -1, -1, -1, 5, 6, 45, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 99, 24, -1, 102, -1, -1, 105, -1, + 107, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 5, 6, 45, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 99, 24, -1, 102, -1, -1, 105, -1, 107, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 5, 6, 45, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 99, 24, + -1, 102, -1, -1, 105, -1, 107, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 5, 6, + 45, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 99, 24, -1, 102, + -1, -1, 105, -1, 107, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 99, -1, -1, 102, -1, -1, + 105, -1, 107, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 35, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, + -1, -1, 99, -1, -1, 102, 56, 57, 105, -1, + 107, -1, 62, 63, 64, 65, 66, 67, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, -1, -1, 87, 88, 89, + 90, 91, 92, 93, 94, 95, 96 +}; -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 142, 143, 144, 0, 25, 31, 41, 42, 43, + 44, 123, 158, 160, 161, 167, 22, 24, 48, 55, + 122, 151, 161, 162, 58, 59, 60, 61, 124, 156, + 23, 168, 169, 30, 108, 159, 168, 49, 50, 51, + 148, 97, 20, 47, 123, 97, 156, 4, 5, 6, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 45, 99, 102, 105, 107, 112, + 131, 132, 133, 134, 135, 151, 164, 29, 107, 157, + 122, 172, 97, 97, 97, 102, 149, 131, 32, 33, + 141, 141, 4, 4, 4, 8, 108, 135, 136, 151, + 100, 109, 35, 46, 56, 57, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 114, + 115, 116, 117, 170, 176, 177, 179, 180, 24, 52, + 53, 147, 4, 24, 150, 133, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 118, 119, 121, + 133, 138, 103, 103, 98, 108, 100, 37, 136, 137, + 133, 166, 56, 8, 166, 9, 21, 10, 11, 12, + 13, 14, 15, 16, 17, 118, 119, 120, 124, 133, + 133, 166, 133, 133, 173, 166, 166, 166, 166, 166, + 166, 133, 133, 133, 166, 124, 85, 86, 98, 104, + 146, 27, 28, 3, 4, 113, 4, 7, 26, 38, + 39, 87, 89, 90, 94, 102, 105, 107, 110, 114, + 115, 116, 117, 139, 164, 145, 135, 135, 135, 37, + 133, 153, 154, 155, 98, 101, 3, 4, 7, 26, + 27, 28, 38, 39, 105, 139, 163, 164, 165, 165, + 165, 165, 131, 98, 126, 98, 126, 165, 102, 98, + 36, 98, 98, 98, 98, 98, 165, 165, 165, 98, + 131, 133, 166, 24, 98, 129, 100, 100, 100, 100, + 104, 138, 140, 140, 108, 140, 24, 100, 100, 100, + 100, 129, 104, 106, 151, 152, 98, 101, 37, 140, + 98, 98, 165, 15, 54, 15, 98, 178, 165, 102, + 133, 166, 133, 166, 133, 133, 98, 98, 98, 166, + 165, 165, 98, 34, 54, 127, 130, 138, 138, 138, + 138, 98, 104, 106, 108, 138, 138, 138, 138, 37, + 153, 127, 128, 106, 21, 21, 100, 165, 4, 165, + 166, 174, 98, 165, 98, 165, 165, 165, 100, 133, + 24, 4, 129, 178, 36, 98, 98, 138, 98, 98, + 98, 98, 54, 125, 165, 165, 174, 175, 98, 126, + 126, 98, 165, 98, 166, 175, 165, 101, 133, 138, + 138, 138, 138, 138, 138, 4, 98, 102, 101, 166, + 104, 165, 101, 101, 98, 101, 101, 101, 101, 101, + 21, 104, 120, 171, 36, 104, 138, 165, 163, 104, + 120, 21, 101, 98, 163, 165, 21, 98, 66, 165, + 21, 21, 165, 165 +}; -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ #endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible at ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t #endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 +#define YYEMPTY (-2) #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) #endif -#else /* not YYLSP_NEEDED */ + +/* YYLEX -- calling `yylex' with the right arguments. */ + #ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) +# define YYLEX yylex (YYLEX_PARAM) #else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ +# define YYLEX yylex () #endif -/* If nonreentrant, generate the variables here */ +/* Enable debugging if requested. */ +#if YYDEBUG -#ifndef YYPURE +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; #endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; #endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -#define YYINITDEPTH 200 +# define YYINITDEPTH 200 #endif -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 +# define YYMAXDEPTH 10000 #endif + -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif { - register char *f = from; - register char *t = to; - register int i = count; + register char *yyd = yydest; + register const char *yys = yysrc; - while (i-- > 0) - *t++ = *f++; + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; } +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + -#else /* __cplusplus */ +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ +#if defined (__STDC__) || defined (__cplusplus) static void -__yy_memcpy (char *to, char *from, unsigned int count) +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif { - register char *t = to; - register char *f = from; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); } +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; #endif -#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} -#line 217 "/usr/share/bison.simple" -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ +/* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ #ifdef YYPARSE_PARAM -int yyparse (void *); +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) #else -int yyparse (void); +int +yyparse () + #endif #endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL { + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -1954,110 +2467,96 @@ so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif + goto yysetstate; +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) + if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - if (yyssp >= yyss + yystacksize - 1) + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -2066,315 +2565,311 @@ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ + if (yychar <= YYEOF) { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); } - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; -/* Do a reduction. yyn is the number of a rule to reduce with. */ + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; - switch (yyn) { -case 2: -#line 992 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: +#line 997 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! ThrowException("Value too large for type!"); yyval.SIntVal = (int32_t)yyvsp[0].UIntVal; -; - break;} -case 4: -#line 1000 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 5: +#line 1005 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! ThrowException("Value too large for type!"); yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val; -; - break;} -case 33: -#line 1023 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 34: +#line 1028 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = yyvsp[-1].StrVal; - ; - break;} -case 34: -#line 1026 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 35: +#line 1031 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; - ; - break;} -case 35: -#line 1030 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::InternalLinkage; ; - break;} -case 36: -#line 1031 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ; - break;} -case 37: -#line 1032 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::WeakLinkage; ; - break;} -case 38: -#line 1033 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::AppendingLinkage; ; - break;} -case 39: -#line 1034 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalLinkage; ; - break;} -case 40: -#line 1036 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 41: -#line 1037 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 42: -#line 1038 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Fast; ; - break;} -case 43: -#line 1039 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Cold; ; - break;} -case 44: -#line 1040 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) - ThrowException("Calling conv too large!"); - yyval.UIntVal = yyvsp[0].UInt64Val; - ; - break;} -case 45: -#line 1048 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 46: -#line 1049 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) - ThrowException("Alignment must be a power of two!"); -; - break;} -case 47: -#line 1054 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 48: -#line 1055 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) - ThrowException("Alignment must be a power of two!"); -; - break;} -case 49: -#line 1062 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) - if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') - ThrowException("Invalid character in section name!"); - yyval.StrVal = yyvsp[0].StrVal; -; - break;} -case 50: -#line 1069 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 51: -#line 1070 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = yyvsp[0].StrVal; ; - break;} -case 52: -#line 1075 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 53: -#line 1076 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 54: -#line 1077 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 36: +#line 1035 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::InternalLinkage; ;} + break; + + case 37: +#line 1036 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;} + break; + + case 38: +#line 1037 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::WeakLinkage; ;} + break; + + case 39: +#line 1038 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::AppendingLinkage; ;} + break; + + case 40: +#line 1039 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::ExternalLinkage; ;} + break; + + case 41: +#line 1041 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::C; ;} + break; + + case 42: +#line 1042 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::C; ;} + break; + + case 43: +#line 1043 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::Fast; ;} + break; + + case 44: +#line 1044 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::Cold; ;} + break; + + case 45: +#line 1045 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) + ThrowException("Calling conv too large!"); + yyval.UIntVal = yyvsp[0].UInt64Val; + ;} + break; + + case 46: +#line 1053 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = 0; ;} + break; + + case 47: +#line 1054 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + yyval.UIntVal = yyvsp[0].UInt64Val; + if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + ThrowException("Alignment must be a power of two!"); +;} + break; + + case 48: +#line 1059 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = 0; ;} + break; + + case 49: +#line 1060 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + yyval.UIntVal = yyvsp[0].UInt64Val; + if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + ThrowException("Alignment must be a power of two!"); +;} + break; + + case 50: +#line 1067 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) + if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') + ThrowException("Invalid character in section name!"); + yyval.StrVal = yyvsp[0].StrVal; +;} + break; + + case 51: +#line 1074 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; ;} + break; + + case 52: +#line 1075 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = yyvsp[0].StrVal; ;} + break; + + case 53: +#line 1080 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 54: +#line 1081 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 55: +#line 1082 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV->setSection(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 55: -#line 1081 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 56: +#line 1086 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) ThrowException("Alignment must be a power of two!"); CurGV->setAlignment(yyvsp[0].UInt64Val); - ; - break;} -case 57: -#line 1094 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; - break;} -case 59: -#line 1095 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; - break;} -case 60: -#line 1097 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 58: +#line 1099 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + break; + + case 60: +#line 1100 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + break; + + case 61: +#line 1102 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) ThrowException("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); yyval.TypeVal = yyvsp[0].TypeVal; - ; - break;} -case 74: -#line 1108 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 75: +#line 1113 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(OpaqueType::get()); - ; - break;} -case 75: -#line 1111 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 76: +#line 1116 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); - ; - break;} -case 76: -#line 1114 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Named types are also simple types... + ;} + break; + + case 77: +#line 1119 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Named types are also simple types... yyval.TypeVal = new PATypeHolder(getTypeVal(yyvsp[0].ValIDVal)); -; - break;} -case 77: -#line 1120 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Type UpReference +;} + break; + + case 78: +#line 1125 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Type UpReference if (yyvsp[0].UInt64Val > (uint64_t)~0U) ThrowException("Value out of range!"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... yyval.TypeVal = new PATypeHolder(OT); UR_OUT("New Upreference!\n"); - ; - break;} -case 78: -#line 1127 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Function derived type? + ;} + break; + + case 79: +#line 1132 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Function derived type? std::vector Params; for (std::list::iterator I = yyvsp[-1].TypeList->begin(), E = yyvsp[-1].TypeList->end(); I != E; ++I) @@ -2385,18 +2880,20 @@ yyval.TypeVal = new PATypeHolder(HandleUpRefs(FunctionType::get(*yyvsp[-3].TypeVal,Params,isVarArg))); delete yyvsp[-1].TypeList; // Delete the argument list delete yyvsp[-3].TypeVal; // Delete the return type handle - ; - break;} -case 79: -#line 1139 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Sized array type? + ;} + break; + + case 80: +#line 1144 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Sized array type? yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); delete yyvsp[-1].TypeVal; - ; - break;} -case 80: -#line 1143 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Packed array type? + ;} + break; + + case 81: +#line 1148 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Packed array type? const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) ThrowException("Unsigned result not equal to signed result"); @@ -2406,11 +2903,12 @@ ThrowException("Vector length should be a power of 2!"); yyval.TypeVal = new PATypeHolder(HandleUpRefs(PackedType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); delete yyvsp[-1].TypeVal; - ; - break;} -case 81: -#line 1154 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Structure type? + ;} + break; + + case 82: +#line 1159 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Structure type? std::vector Elements; for (std::list::iterator I = yyvsp[-1].TypeList->begin(), E = yyvsp[-1].TypeList->end(); I != E; ++I) @@ -2418,55 +2916,63 @@ yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); delete yyvsp[-1].TypeList; - ; - break;} -case 82: -#line 1163 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Empty structure type? + ;} + break; + + case 83: +#line 1168 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Empty structure type? yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); - ; - break;} -case 83: -#line 1166 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Pointer type? + ;} + break; + + case 84: +#line 1171 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Pointer type? yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); delete yyvsp[-1].TypeVal; - ; - break;} -case 84: -#line 1174 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 85: +#line 1179 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeList = new std::list(); yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 85: -#line 1178 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 86: +#line 1183 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 87: -#line 1184 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 88: +#line 1189 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); - ; - break;} -case 88: -#line 1187 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 89: +#line 1192 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeList = new std::list())->push_back(Type::VoidTy); - ; - break;} -case 89: -#line 1190 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 90: +#line 1195 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeList = new std::list(); - ; - break;} -case 90: -#line 1200 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr + ;} + break; + + case 91: +#line 1205 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); if (ATy == 0) ThrowException("Cannot make array constant with type: '" + @@ -2490,11 +2996,12 @@ yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; - ; - break;} -case 91: -#line 1225 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 92: +#line 1230 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) ThrowException("Cannot make array constant with type: '" + @@ -2506,11 +3013,12 @@ " arguments, but has size of " + itostr(NumElements) +"!"); yyval.ConstVal = ConstantArray::get(ATy, std::vector()); delete yyvsp[-2].TypeVal; - ; - break;} -case 92: -#line 1238 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 93: +#line 1243 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) ThrowException("Cannot make array constant with type: '" + @@ -2537,11 +3045,12 @@ free(yyvsp[0].StrVal); yyval.ConstVal = ConstantArray::get(ATy, Vals); delete yyvsp[-2].TypeVal; - ; - break;} -case 93: -#line 1266 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr + ;} + break; + + case 94: +#line 1271 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); if (PTy == 0) ThrowException("Cannot make packed constant with type: '" + @@ -2565,11 +3074,12 @@ yyval.ConstVal = ConstantPacked::get(PTy, *yyvsp[-1].ConstVector); delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; - ; - break;} -case 94: -#line 1291 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 95: +#line 1296 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); if (STy == 0) ThrowException("Cannot make struct constant with type: '" + @@ -2588,11 +3098,12 @@ yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; - ; - break;} -case 95: -#line 1311 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 96: +#line 1316 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); if (STy == 0) ThrowException("Cannot make struct constant with type: '" + @@ -2603,11 +3114,12 @@ yyval.ConstVal = ConstantStruct::get(STy, std::vector()); delete yyvsp[-2].TypeVal; - ; - break;} -case 96: -#line 1323 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 97: +#line 1328 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); if (PTy == 0) ThrowException("Cannot make null pointer constant with type: '" + @@ -2615,18 +3127,20 @@ yyval.ConstVal = ConstantPointerNull::get(PTy); delete yyvsp[-1].TypeVal; - ; - break;} -case 97: -#line 1332 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 98: +#line 1337 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); delete yyvsp[-1].TypeVal; - ; - break;} -case 98: -#line 1336 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 99: +#line 1341 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); if (Ty == 0) ThrowException("Global const reference must be a pointer type!"); @@ -2684,66 +3198,74 @@ yyval.ConstVal = cast(V); delete yyvsp[-1].TypeVal; // Free the type handle - ; - break;} -case 99: -#line 1395 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 100: +#line 1400 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) ThrowException("Mismatched types for constant expression!"); yyval.ConstVal = yyvsp[0].ConstVal; delete yyvsp[-1].TypeVal; - ; - break;} -case 100: -#line 1401 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 101: +#line 1406 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const Type *Ty = yyvsp[-1].TypeVal->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) ThrowException("Cannot create a null initialized value of this type!"); yyval.ConstVal = Constant::getNullValue(Ty); delete yyvsp[-1].TypeVal; - ; - break;} -case 101: -#line 1409 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // integral constants + ;} + break; + + case 102: +#line 1414 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // integral constants if (!ConstantSInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) ThrowException("Constant value doesn't fit in type!"); yyval.ConstVal = ConstantSInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); - ; - break;} -case 102: -#line 1414 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // integral constants + ;} + break; + + case 103: +#line 1419 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // integral constants if (!ConstantUInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) ThrowException("Constant value doesn't fit in type!"); yyval.ConstVal = ConstantUInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); - ; - break;} -case 103: -#line 1419 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants + ;} + break; + + case 104: +#line 1424 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants yyval.ConstVal = ConstantBool::True; - ; - break;} -case 104: -#line 1422 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants + ;} + break; + + case 105: +#line 1427 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants yyval.ConstVal = ConstantBool::False; - ; - break;} -case 105: -#line 1425 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Float & Double constants + ;} + break; + + case 106: +#line 1430 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Float & Double constants if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) ThrowException("Floating point constant invalid for type!!"); yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); - ; - break;} -case 106: -#line 1432 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 107: +#line 1437 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!yyvsp[-3].ConstVal->getType()->isFirstClassType()) ThrowException("cast constant expression from a non-primitive type: '" + yyvsp[-3].ConstVal->getType()->getDescription() + "'!"); @@ -2752,11 +3274,12 @@ yyvsp[-1].TypeVal->get()->getDescription() + "'!"); yyval.ConstVal = ConstantExpr::getCast(yyvsp[-3].ConstVal, yyvsp[-1].TypeVal->get()); delete yyvsp[-1].TypeVal; - ; - break;} -case 107: -#line 1442 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 108: +#line 1447 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-2].ConstVal->getType())) ThrowException("GetElementPtr requires a pointer operand!"); @@ -2786,21 +3309,23 @@ delete yyvsp[-1].ValueList; yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, IdxVec); - ; - break;} -case 108: -#line 1473 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 109: +#line 1478 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) ThrowException("Select condition must be of boolean type!"); if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Select operand types must match!"); yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 109: -#line 1480 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 110: +#line 1485 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Binary operator types must match!"); // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs. @@ -2820,11 +3345,12 @@ ConstantExpr::getCast(yyvsp[-1].ConstVal, IntPtrTy)); yyval.ConstVal = ConstantExpr::getCast(yyval.ConstVal, yyvsp[-3].ConstVal->getType()); } - ; - break;} -case 110: -#line 1501 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 111: +#line 1506 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Logical operator types must match!"); if (!yyvsp[-3].ConstVal->getType()->isIntegral()) { @@ -2833,87 +3359,99 @@ ThrowException("Logical operator requires integral operands!"); } yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 111: -#line 1511 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 112: +#line 1516 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("setcc operand types must match!"); yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 112: -#line 1516 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 113: +#line 1521 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) ThrowException("Shift count for shift constant must be unsigned byte!"); if (!yyvsp[-3].ConstVal->getType()->isInteger()) ThrowException("Shift constant expression requires integer operand!"); yyval.ConstVal = ConstantExpr::get(yyvsp[-5].OtherOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 113: -#line 1523 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 114: +#line 1528 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-3].ConstVal->getType())) ThrowException("First operand of extractelement must be " "packed type!"); if (yyvsp[-1].ConstVal->getType() != Type::UIntTy) ThrowException("Second operand of extractelement must be uint!"); yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 114: -#line 1533 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 115: +#line 1538 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); - ; - break;} -case 115: -#line 1536 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 116: +#line 1541 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ConstVector = new std::vector(); yyval.ConstVector->push_back(yyvsp[0].ConstVal); - ; - break;} -case 116: -#line 1543 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = false; ; - break;} -case 117: -#line 1543 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = true; ; - break;} -case 118: -#line 1553 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 117: +#line 1548 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; ;} + break; + + case 118: +#line 1548 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; ;} + break; + + case 119: +#line 1558 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; CurModule.ModuleDone(); -; - break;} -case 119: -#line 1560 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 120: +#line 1565 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = yyvsp[-1].ModuleVal; CurFun.FunctionDone(); - ; - break;} -case 120: -#line 1564 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 121: +#line 1569 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = yyvsp[-1].ModuleVal; - ; - break;} -case 121: -#line 1567 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 122: +#line 1572 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = yyvsp[-1].ModuleVal; - ; - break;} -case 122: -#line 1570 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 123: +#line 1575 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { @@ -2923,11 +3461,12 @@ else ThrowException("Reference to an undefined type: #" + itostr(DID.Num)); } - ; - break;} -case 123: -#line 1583 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 124: +#line 1588 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: // @@ -2946,164 +3485,189 @@ } delete yyvsp[0].TypeVal; - ; - break;} -case 124: -#line 1603 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Function prototypes can be in const pool - ; - break;} -case 125: -#line 1605 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 125: +#line 1608 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Function prototypes can be in const pool + ;} + break; + + case 126: +#line 1610 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].ConstVal == 0) ThrowException("Global value initializer is not a constant!"); CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); - ; - break;} -case 126: -#line 1608 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 127: +#line 1613 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 127: -#line 1611 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 128: +#line 1616 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); delete yyvsp[0].TypeVal; - ; - break;} -case 128: -#line 1615 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 129: +#line 1620 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 129: -#line 1618 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 130: -#line 1620 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 131: -#line 1622 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 132: -#line 1627 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Endianness = Module::BigEndian; ; - break;} -case 133: -#line 1628 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.Endianness = Module::LittleEndian; ; - break;} -case 134: -#line 1630 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 130: +#line 1623 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 131: +#line 1625 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 132: +#line 1627 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 133: +#line 1632 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Endianness = Module::BigEndian; ;} + break; + + case 134: +#line 1633 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Endianness = Module::LittleEndian; ;} + break; + + case 135: +#line 1635 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); - ; - break;} -case 135: -#line 1633 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 136: +#line 1638 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UInt64Val == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); else if (yyvsp[0].UInt64Val == 64) CurModule.CurrentModule->setPointerSize(Module::Pointer64); else ThrowException("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'!"); - ; - break;} -case 136: -#line 1641 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 137: +#line 1646 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 138: -#line 1648 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 139: +#line 1653 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 139: -#line 1652 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 140: +#line 1657 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 140: -#line 1656 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 144: -#line 1665 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 145: -#line 1667 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 141: +#line 1661 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 145: +#line 1670 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; ;} + break; + + case 146: +#line 1672 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (*yyvsp[-1].TypeVal == Type::VoidTy) ThrowException("void typed arguments are invalid!"); yyval.ArgVal = new std::pair(yyvsp[-1].TypeVal, yyvsp[0].StrVal); -; - break;} -case 146: -#line 1673 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 147: +#line 1678 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = yyvsp[-2].ArgList; yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); delete yyvsp[0].ArgVal; - ; - break;} -case 147: -#line 1678 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 148: +#line 1683 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = new std::vector >(); yyval.ArgList->push_back(*yyvsp[0].ArgVal); delete yyvsp[0].ArgVal; - ; - break;} -case 148: -#line 1684 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 149: +#line 1689 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = yyvsp[0].ArgList; - ; - break;} -case 149: -#line 1687 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 150: +#line 1692 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = yyvsp[-2].ArgList; yyval.ArgList->push_back(std::pair(new PATypeHolder(Type::VoidTy), 0)); - ; - break;} -case 150: -#line 1692 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 151: +#line 1697 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = new std::vector >(); yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); - ; - break;} -case 151: -#line 1696 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 152: +#line 1701 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = 0; - ; - break;} -case 152: -#line 1701 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 153: +#line 1706 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { UnEscapeLexed(yyvsp[-5].StrVal); std::string FunctionName(yyvsp[-5].StrVal); free(yyvsp[-5].StrVal); // Free strdup'd memory! @@ -3186,86 +3750,99 @@ delete yyvsp[-3].ArgList; // We're now done with the argument list } -; - break;} -case 155: -#line 1788 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 156: +#line 1793 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = CurFun.CurrentFunction; // Make sure that we keep track of the linkage type even if there was a // previous "declare". yyval.FunctionVal->setLinkage(yyvsp[-2].Linkage); -; - break;} -case 158: -#line 1798 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 159: +#line 1803 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = yyvsp[-1].FunctionVal; -; - break;} -case 159: -#line 1802 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ CurFun.isDeclare = true; ; - break;} -case 160: -#line 1802 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 160: +#line 1807 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurFun.isDeclare = true; ;} + break; + + case 161: +#line 1807 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = CurFun.CurrentFunction; CurFun.FunctionDone(); -; - break;} -case 161: -#line 1811 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // A reference to a direct constant +;} + break; + + case 162: +#line 1816 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // A reference to a direct constant yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); - ; - break;} -case 162: -#line 1814 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 163: +#line 1819 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); - ; - break;} -case 163: -#line 1817 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Perhaps it's an FP constant? + ;} + break; + + case 164: +#line 1822 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Perhaps it's an FP constant? yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); - ; - break;} -case 164: -#line 1820 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 165: +#line 1825 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(ConstantBool::True); - ; - break;} -case 165: -#line 1823 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 166: +#line 1828 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(ConstantBool::False); - ; - break;} -case 166: -#line 1826 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 167: +#line 1831 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::createNull(); - ; - break;} -case 167: -#line 1829 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 168: +#line 1834 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::createUndef(); - ; - break;} -case 168: -#line 1832 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // A vector zero constant. + ;} + break; + + case 169: +#line 1837 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // A vector zero constant. yyval.ValIDVal = ValID::createZeroInit(); - ; - break;} -case 169: -#line 1835 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized packed vector + ;} + break; + + case 170: +#line 1840 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized packed vector const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); int NumElements = yyvsp[-1].ConstVector->size(); @@ -3288,65 +3865,74 @@ yyval.ValIDVal = ValID::create(ConstantPacked::get(pt, *yyvsp[-1].ConstVector)); delete PTy; delete yyvsp[-1].ConstVector; - ; - break;} -case 170: -#line 1859 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 171: +#line 1864 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); - ; - break;} -case 171: -#line 1866 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it an integer reference...? + ;} + break; + + case 172: +#line 1871 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Is it an integer reference...? yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); - ; - break;} -case 172: -#line 1869 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Is it a named reference...? + ;} + break; + + case 173: +#line 1874 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Is it a named reference...? yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); - ; - break;} -case 175: -#line 1880 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 176: +#line 1885 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 176: -#line 1884 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 177: +#line 1889 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = yyvsp[-1].FunctionVal; - ; - break;} -case 177: -#line 1887 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Do not allow functions with 0 basic blocks + ;} + break; + + case 178: +#line 1892 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Do not allow functions with 0 basic blocks yyval.FunctionVal = yyvsp[-1].FunctionVal; - ; - break;} -case 178: -#line 1895 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 179: +#line 1900 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); InsertValue(yyvsp[0].TermInstVal); yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); InsertValue(yyvsp[-2].BasicBlockVal); yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; - ; - break;} -case 179: -#line 1904 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 180: +#line 1909 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; - ; - break;} -case 180: -#line 1908 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 181: +#line 1913 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); // Make sure to move the basic block to the correct location in the @@ -3355,11 +3941,12 @@ Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); - ; - break;} -case 181: -#line 1918 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 182: +#line 1923 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); // Make sure to move the basic block to the correct location in the @@ -3368,35 +3955,40 @@ Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); - ; - break;} -case 182: -#line 1929 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Return with a result... + ;} + break; + + case 183: +#line 1934 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Return with a result... yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); - ; - break;} -case 183: -#line 1932 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Return with no result... + ;} + break; + + case 184: +#line 1937 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Return with no result... yyval.TermInstVal = new ReturnInst(); - ; - break;} -case 184: -#line 1935 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Unconditional Branch... + ;} + break; + + case 185: +#line 1940 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Unconditional Branch... yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[0].ValIDVal)); - ; - break;} -case 185: -#line 1938 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 186: +#line 1943 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[-3].ValIDVal), getBBVal(yyvsp[0].ValIDVal), getVal(Type::BoolTy, yyvsp[-6].ValIDVal)); - ; - break;} -case 186: -#line 1941 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 187: +#line 1946 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { SwitchInst *S = new SwitchInst(getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal), getBBVal(yyvsp[-3].ValIDVal), yyvsp[-1].JumpTable->size()); yyval.TermInstVal = S; @@ -3409,18 +4001,20 @@ ThrowException("Switch case is constant, but not a simple integer!"); } delete yyvsp[-1].JumpTable; - ; - break;} -case 187: -#line 1955 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 188: +#line 1960 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { SwitchInst *S = new SwitchInst(getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal), getBBVal(yyvsp[-2].ValIDVal), 0); yyval.TermInstVal = S; - ; - break;} -case 188: -#line 1960 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 189: +#line 1965 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PFTy; const FunctionType *Ty; @@ -3471,34 +4065,38 @@ delete yyvsp[-10].TypeVal; delete yyvsp[-7].ValueList; - ; - break;} -case 189: -#line 2012 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 190: +#line 2017 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TermInstVal = new UnwindInst(); - ; - break;} -case 190: -#line 2015 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 191: +#line 2020 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TermInstVal = new UnreachableInst(); - ; - break;} -case 191: -#line 2021 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 192: +#line 2026 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.JumpTable = yyvsp[-5].JumpTable; Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); if (V == 0) ThrowException("May only switch on a constant pool value!"); yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); - ; - break;} -case 192: -#line 2029 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 193: +#line 2034 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.JumpTable = new std::vector >(); Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); @@ -3506,66 +4104,75 @@ ThrowException("May only switch on a constant pool value!"); yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); - ; - break;} -case 193: -#line 2039 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 194: +#line 2044 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Is this definition named?? if so, assign the name... setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); InsertValue(yyvsp[0].InstVal); yyval.InstVal = yyvsp[0].InstVal; -; - break;} -case 194: -#line 2046 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Used for PHI nodes +;} + break; + + case 195: +#line 2051 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Used for PHI nodes yyval.PHIList = new std::list >(); yyval.PHIList->push_back(std::make_pair(getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); delete yyvsp[-5].TypeVal; - ; - break;} -case 195: -#line 2051 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 196: +#line 2056 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.PHIList = yyvsp[-6].PHIList; yyvsp[-6].PHIList->push_back(std::make_pair(getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); - ; - break;} -case 196: -#line 2058 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ // Used for call statements, and memory insts... + ;} + break; + + case 197: +#line 2063 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Used for call statements, and memory insts... yyval.ValueList = new std::vector(); yyval.ValueList->push_back(yyvsp[0].ValueVal); - ; - break;} -case 197: -#line 2062 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 198: +#line 2067 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = yyvsp[-2].ValueList; yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); - ; - break;} -case 199: -#line 2068 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ yyval.ValueList = 0; ; - break;} -case 200: -#line 2070 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 200: +#line 2073 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = 0; ;} + break; + + case 201: +#line 2075 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; - ; - break;} -case 201: -#line 2073 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 202: +#line 2078 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; - ; - break;} -case 202: -#line 2079 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 203: +#line 2084 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && !isa((*yyvsp[-3].TypeVal).get())) ThrowException( @@ -3576,11 +4183,12 @@ if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); delete yyvsp[-3].TypeVal; - ; - break;} -case 203: -#line 2091 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 204: +#line 2096 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!(*yyvsp[-3].TypeVal)->isIntegral()) { if (!isa(yyvsp[-3].TypeVal->get()) || !cast(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral()) @@ -3590,11 +4198,12 @@ if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); delete yyvsp[-3].TypeVal; - ; - break;} -case 204: -#line 2102 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 205: +#line 2107 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if(isa((*yyvsp[-3].TypeVal).get())) { ThrowException( "PackedTypes currently not supported in setcc instructions!"); @@ -3603,11 +4212,12 @@ if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); delete yyvsp[-3].TypeVal; - ; - break;} -case 205: -#line 2112 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 206: +#line 2117 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { std::cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; @@ -3618,49 +4228,54 @@ yyval.InstVal = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal, Ones); if (yyval.InstVal == 0) ThrowException("Could not create a xor instruction!"); - ; - break;} -case 206: -#line 2124 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 207: +#line 2129 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].ValueVal->getType() != Type::UByteTy) ThrowException("Shift amount must be ubyte!"); if (!yyvsp[-2].ValueVal->getType()->isInteger()) ThrowException("Shift constant expression requires integer operand!"); yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 207: -#line 2131 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 208: +#line 2136 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!yyvsp[0].TypeVal->get()->isFirstClassType()) ThrowException("cast instruction to a non-primitive type: '" + yyvsp[0].TypeVal->get()->getDescription() + "'!"); yyval.InstVal = new CastInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 208: -#line 2138 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 209: +#line 2143 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) ThrowException("select condition must be boolean!"); if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) ThrowException("select value types should match!"); yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 209: -#line 2145 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 210: +#line 2150 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { NewVarArgs = true; yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 210: -#line 2150 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 211: +#line 2155 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); Function* NF = CurModule.CurrentModule-> @@ -3678,11 +4293,12 @@ CurBB->getInstList().push_back(new StoreInst(bar, foo)); yyval.InstVal = new VAArgInst(foo, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 211: -#line 2169 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 212: +#line 2174 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); Function* NF = CurModule.CurrentModule-> @@ -3703,22 +4319,24 @@ CurBB->getInstList().push_back(tmp); yyval.InstVal = new LoadInst(foo); delete yyvsp[0].TypeVal; - ; - break;} -case 212: -#line 2191 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 213: +#line 2196 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-2].ValueVal->getType())) ThrowException("First operand of extractelement must be a " "packed type val!"); if (yyvsp[0].ValueVal->getType() != Type::UIntTy) ThrowException("Second operand of extractelement must be a uint!"); yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 213: -#line 2199 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 214: +#line 2204 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const Type *Ty = yyvsp[0].PHIList->front().first->getType(); if (!Ty->isFirstClassType()) ThrowException("PHI node operands must be of first class type!"); @@ -3731,11 +4349,12 @@ yyvsp[0].PHIList->pop_front(); } delete yyvsp[0].PHIList; // Free the list... - ; - break;} -case 214: -#line 2213 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 215: +#line 2218 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PFTy; const FunctionType *Ty; @@ -3791,78 +4410,89 @@ cast(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal); delete yyvsp[-4].TypeVal; delete yyvsp[-1].ValueList; - ; - break;} -case 215: -#line 2270 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 216: +#line 2275 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = yyvsp[0].InstVal; - ; - break;} -case 216: -#line 2276 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 217: +#line 2281 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = yyvsp[0].ValueList; - ; - break;} -case 217: -#line 2278 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 218: +#line 2283 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = new std::vector(); - ; - break;} -case 218: -#line 2282 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 219: +#line 2287 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; - ; - break;} -case 219: -#line 2285 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 220: +#line 2290 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; - ; - break;} -case 220: -#line 2291 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 221: +#line 2296 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 221: -#line 2295 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 222: +#line 2300 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; - ; - break;} -case 222: -#line 2299 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 223: +#line 2304 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 223: -#line 2303 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 224: +#line 2308 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; - ; - break;} -case 224: -#line 2307 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 225: +#line 2312 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[0].ValueVal->getType())) ThrowException("Trying to free nonpointer type " + yyvsp[0].ValueVal->getType()->getDescription() + "!"); yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); - ; - break;} -case 225: -#line 2314 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 226: +#line 2319 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-1].TypeVal->get())) ThrowException("Can't load from nonpointer type: " + (*yyvsp[-1].TypeVal)->getDescription()); @@ -3871,11 +4501,12 @@ (*yyvsp[-1].TypeVal)->getDescription()); yyval.InstVal = new LoadInst(getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal), "", yyvsp[-3].BoolVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 226: -#line 2324 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 227: +#line 2329 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); if (!PT) ThrowException("Can't store to a nonpointer type: " + @@ -3887,11 +4518,12 @@ yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal), yyvsp[-5].BoolVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 227: -#line 2337 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 228: +#line 2342 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-2].TypeVal->get())) ThrowException("getelementptr insn requires pointer operand!"); @@ -3911,231 +4543,239 @@ (*yyvsp[-2].TypeVal)->getDescription()+ "'!"); yyval.InstVal = new GetElementPtrInst(getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal), *yyvsp[0].ValueList); delete yyvsp[-2].TypeVal; delete yyvsp[0].ValueList; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + ;} + break; + + + } + +/* Line 1000 of yacc.c. */ +#line 4554 "llvmAsmParser.tab.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif + + YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("syntax error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("syntax error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; - yychar = YYEMPTY; + } } - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; - goto yyerrhandle; -yyerrdefault: /* current state does not do anything special for the error token. */ +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; #endif -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif -yyerrhandle: +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 2360 "/Users/sabre/llvm/lib/AsmParser/llvmAsmParser.y" + + +#line 2365 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" int yyerror(const char *ErrorMsg) { std::string where @@ -4149,3 +4789,4 @@ ThrowException(errMsg); return 0; } + Index: llvm/lib/AsmParser/llvmAsmParser.h diff -u llvm/lib/AsmParser/llvmAsmParser.h:1.13 llvm/lib/AsmParser/llvmAsmParser.h:1.14 --- llvm/lib/AsmParser/llvmAsmParser.h:1.13 Tue Jan 10 13:04:32 2006 +++ llvm/lib/AsmParser/llvmAsmParser.h Mon Jan 16 15:12:35 2006 @@ -1,4 +1,231 @@ -typedef union { +/* A Bison parser, made by GNU Bison 1.875c. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + SECTION = 289, + VOLATILE = 290, + TO = 291, + DOTDOTDOT = 292, + NULL_TOK = 293, + UNDEF = 294, + CONST = 295, + INTERNAL = 296, + LINKONCE = 297, + WEAK = 298, + APPENDING = 299, + OPAQUE = 300, + NOT = 301, + EXTERNAL = 302, + TARGET = 303, + TRIPLE = 304, + ENDIAN = 305, + POINTERSIZE = 306, + LITTLE = 307, + BIG = 308, + ALIGN = 309, + DEPLIBS = 310, + CALL = 311, + TAIL = 312, + CC_TOK = 313, + CCC_TOK = 314, + FASTCC_TOK = 315, + COLDCC_TOK = 316, + RET = 317, + BR = 318, + SWITCH = 319, + INVOKE = 320, + UNWIND = 321, + UNREACHABLE = 322, + ADD = 323, + SUB = 324, + MUL = 325, + DIV = 326, + REM = 327, + AND = 328, + OR = 329, + XOR = 330, + SETLE = 331, + SETGE = 332, + SETLT = 333, + SETGT = 334, + SETEQ = 335, + SETNE = 336, + MALLOC = 337, + ALLOCA = 338, + FREE = 339, + LOAD = 340, + STORE = 341, + GETELEMENTPTR = 342, + PHI_TOK = 343, + CAST = 344, + SELECT = 345, + SHL = 346, + SHR = 347, + VAARG = 348, + EXTRACTELEMENT = 349, + VAARG_old = 350, + VANEXT_old = 351 + }; +#endif +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define SECTION 289 +#define VOLATILE 290 +#define TO 291 +#define DOTDOTDOT 292 +#define NULL_TOK 293 +#define UNDEF 294 +#define CONST 295 +#define INTERNAL 296 +#define LINKONCE 297 +#define WEAK 298 +#define APPENDING 299 +#define OPAQUE 300 +#define NOT 301 +#define EXTERNAL 302 +#define TARGET 303 +#define TRIPLE 304 +#define ENDIAN 305 +#define POINTERSIZE 306 +#define LITTLE 307 +#define BIG 308 +#define ALIGN 309 +#define DEPLIBS 310 +#define CALL 311 +#define TAIL 312 +#define CC_TOK 313 +#define CCC_TOK 314 +#define FASTCC_TOK 315 +#define COLDCC_TOK 316 +#define RET 317 +#define BR 318 +#define SWITCH 319 +#define INVOKE 320 +#define UNWIND 321 +#define UNREACHABLE 322 +#define ADD 323 +#define SUB 324 +#define MUL 325 +#define DIV 326 +#define REM 327 +#define AND 328 +#define OR 329 +#define XOR 330 +#define SETLE 331 +#define SETGE 332 +#define SETLT 333 +#define SETGT 334 +#define SETEQ 335 +#define SETNE 336 +#define MALLOC 337 +#define ALLOCA 338 +#define FREE 339 +#define LOAD 340 +#define STORE 341 +#define GETELEMENTPTR 342 +#define PHI_TOK 343 +#define CAST 344 +#define SELECT 345 +#define SHL 346 +#define SHR 347 +#define VAARG 348 +#define EXTRACTELEMENT 349 +#define VAARG_old 350 +#define VANEXT_old 351 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 878 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -37,100 +264,14 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define SINTVAL 259 -#define UINTVAL 260 -#define FPVAL 261 -#define VOID 262 -#define BOOL 263 -#define SBYTE 264 -#define UBYTE 265 -#define SHORT 266 -#define USHORT 267 -#define INT 268 -#define UINT 269 -#define LONG 270 -#define ULONG 271 -#define FLOAT 272 -#define DOUBLE 273 -#define TYPE 274 -#define LABEL 275 -#define VAR_ID 276 -#define LABELSTR 277 -#define STRINGCONSTANT 278 -#define IMPLEMENTATION 279 -#define ZEROINITIALIZER 280 -#define TRUETOK 281 -#define FALSETOK 282 -#define BEGINTOK 283 -#define ENDTOK 284 -#define DECLARE 285 -#define GLOBAL 286 -#define CONSTANT 287 -#define SECTION 288 -#define VOLATILE 289 -#define TO 290 -#define DOTDOTDOT 291 -#define NULL_TOK 292 -#define UNDEF 293 -#define CONST 294 -#define INTERNAL 295 -#define LINKONCE 296 -#define WEAK 297 -#define APPENDING 298 -#define OPAQUE 299 -#define NOT 300 -#define EXTERNAL 301 -#define TARGET 302 -#define TRIPLE 303 -#define ENDIAN 304 -#define POINTERSIZE 305 -#define LITTLE 306 -#define BIG 307 -#define ALIGN 308 -#define DEPLIBS 309 -#define CALL 310 -#define TAIL 311 -#define CC_TOK 312 -#define CCC_TOK 313 -#define FASTCC_TOK 314 -#define COLDCC_TOK 315 -#define RET 316 -#define BR 317 -#define SWITCH 318 -#define INVOKE 319 -#define UNWIND 320 -#define UNREACHABLE 321 -#define ADD 322 -#define SUB 323 -#define MUL 324 -#define DIV 325 -#define REM 326 -#define AND 327 -#define OR 328 -#define XOR 329 -#define SETLE 330 -#define SETGE 331 -#define SETLT 332 -#define SETGT 333 -#define SETEQ 334 -#define SETNE 335 -#define MALLOC 336 -#define ALLOCA 337 -#define FREE 338 -#define LOAD 339 -#define STORE 340 -#define GETELEMENTPTR 341 -#define PHI_TOK 342 -#define CAST 343 -#define SELECT 344 -#define SHL 345 -#define SHR 346 -#define VAARG 347 -#define EXTRACTELEMENT 348 -#define VAARG_old 349 -#define VANEXT_old 350 - +/* Line 1275 of yacc.c. */ +#line 269 "llvmAsmParser.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif extern YYSTYPE llvmAsmlval; + + + Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.242 llvm/lib/AsmParser/llvmAsmParser.y:1.243 --- llvm/lib/AsmParser/llvmAsmParser.y:1.242 Tue Jan 10 13:04:32 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y Mon Jan 16 15:12:35 2006 @@ -17,6 +17,7 @@ #include "llvm/Instructions.h" #include "llvm/Module.h" #include "llvm/SymbolTable.h" +#include "llvm/Assembly/AutoUpgrade.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/MathExtras.h" @@ -104,12 +105,16 @@ ThrowException(UndefinedReferences); } + // Rename any overloaded intrinsic functions. + for (Module::iterator FI = CurrentModule->begin(), FE = + CurrentModule->end(); FI != FE; ++FI) + UpgradeIntrinsicFunction(&(*FI)); + Values.clear(); // Clear out function local definitions Types.clear(); CurrentModule = 0; } - // GetForwardRefForGlobal - Check to see if there is a forward reference // for this global. If so, remove it from the GlobalRefs map and return it. // If not, just return null. From reid at x10sys.com Mon Jan 16 15:14:13 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 15:14:13 -0600 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200601162114.PAA21543@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.128 -> 1.129 --- Log message: There is no llvm.bswap.i8, need at least 2 bytes to swap. --- Diffs of the changes: (+1 -2) LangRef.html | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.128 llvm/docs/LangRef.html:1.129 --- llvm/docs/LangRef.html:1.128 Mon Jan 16 15:12:35 2006 +++ llvm/docs/LangRef.html Mon Jan 16 15:14:01 2006 @@ -3485,7 +3485,6 @@
    Syntax:
    -  declare ushort %llvm.bswap.i8( ubyte <id> )
       declare ushort %llvm.bswap.i16( ushort <id> )
       declare uint %llvm.bswap.i32( uint <id> )
       declare ulong %llvm.bswap.i64( ulong <id> )
    @@ -3651,7 +3650,7 @@
     
       Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/01/16 21:12:35 $ + Last modified: $Date: 2006/01/16 21:14:01 $ From evan.cheng at apple.com Mon Jan 16 15:21:41 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 15:21:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp X86ISelLowering.cpp X86InstrInfo.td Message-ID: <200601162121.PAA21671@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.32 -> 1.33 X86ISelLowering.cpp updated: 1.42 -> 1.43 X86InstrInfo.td updated: 1.206 -> 1.207 --- Log message: Fix FP_TO_INT**_IN_MEM lowering. --- Diffs of the changes: (+132 -103) X86ISelDAGToDAG.cpp | 58 -------------------- X86ISelLowering.cpp | 150 +++++++++++++++++++++++++++++++++++++--------------- X86InstrInfo.td | 27 ++++++++- 3 files changed, 132 insertions(+), 103 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.32 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.33 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.32 Sun Jan 15 03:00:21 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Mon Jan 16 15:21:29 2006 @@ -642,64 +642,6 @@ return CodeGenMap[N] = CurDAG->getTargetNode(Opc, VT, Result); break; } - - case X86ISD::FP_TO_INT16_IN_MEM: - case X86ISD::FP_TO_INT32_IN_MEM: - case X86ISD::FP_TO_INT64_IN_MEM: { - assert(N.getOperand(1).getValueType() == MVT::f64); - - // Change the floating point control register to use "round towards zero" - // mode when truncating to an integer value. - MachineFunction &MF = CurDAG->getMachineFunction(); - int CWFI = MF.getFrameInfo()->CreateStackObject(2, 2); - SDOperand CWSlot = CurDAG->getFrameIndex(CWFI, MVT::i32); - SDOperand Base, Scale, Index, Disp; - (void)SelectAddr(CWSlot, Base, Scale, Index, Disp); - SDOperand Chain = N.getOperand(0); - - // Save the control word. - Chain = CurDAG->getTargetNode(X86::FNSTCW16m, MVT::Other, - Base, Scale, Index, Disp, Chain); - - // Load the old value of the high byte of the control word. - SDOperand OldCW = - CurDAG->getTargetNode(X86::MOV16rm, MVT::i16, MVT::Other, - Base, Scale, Index, Disp, Chain); - Chain = OldCW.getValue(1); - - // Set the high part to be round to zero... - Chain = CurDAG->getTargetNode(X86::MOV16mi, MVT::Other, - Base, Scale, Index, Disp, - CurDAG->getConstant(0xC7F, MVT::i16), - Chain); - - // Reload the modified control word now... - Chain = CurDAG->getTargetNode(X86::FLDCW16m, MVT::Other, - Base, Scale, Index, Disp, Chain); - - // Restore the memory image of control word to original value - Chain = CurDAG->getTargetNode(X86::MOV16mr, MVT::Other, - Base, Scale, Index, Disp, OldCW, Chain); - - switch (Opcode) { - default: assert(0 && "Unknown FP_TO_INT*_IN_MEM"); - case X86ISD::FP_TO_INT16_IN_MEM: Opc = X86::FpIST16m; break; - case X86ISD::FP_TO_INT32_IN_MEM: Opc = X86::FpIST32m; break; - case X86ISD::FP_TO_INT64_IN_MEM: Opc = X86::FpIST64m; break; - } - - SDOperand N1 = Select(N.getOperand(1)); - SDOperand Base2, Scale2, Index2, Disp2; - (void)SelectAddr(N.getOperand(2), Base2, Scale2, Index2, Disp2); - Chain = CurDAG->getTargetNode(Opc, MVT::Other, - Base2, Scale2, Index2, Disp2, N1, Chain); - - // Reload the modified control word now... - CodeGenMap[N] = - Chain = CurDAG->getTargetNode(X86::FLDCW16m, MVT::Other, - Base, Scale, Index, Disp, Chain); - return Chain; - } } return SelectCode(N); Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.42 llvm/lib/Target/X86/X86ISelLowering.cpp:1.43 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.42 Sun Jan 15 03:00:21 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Jan 16 15:21:29 2006 @@ -13,6 +13,7 @@ //===----------------------------------------------------------------------===// #include "X86.h" +#include "X86InstrBuilder.h" #include "X86ISelLowering.h" #include "X86TargetMachine.h" #include "llvm/CallingConv.h" @@ -1261,54 +1262,117 @@ MachineBasicBlock * X86TargetLowering::InsertAtEndOfBasicBlock(MachineInstr *MI, MachineBasicBlock *BB) { - assert((MI->getOpcode() == X86::CMOV_FR32 || - MI->getOpcode() == X86::CMOV_FR64) && - "Unexpected instr type to insert"); - - // To "insert" a SELECT_CC instruction, we actually have to insert the diamond - // control-flow pattern. The incoming instruction knows the destination vreg - // to set, the condition code register to branch on, the true/false values to - // select between, and a branch opcode to use. - const BasicBlock *LLVM_BB = BB->getBasicBlock(); - ilist::iterator It = BB; - ++It; + switch (MI->getOpcode()) { + default: assert(false && "Unexpected instr type to insert"); + case X86::CMOV_FR32: + case X86::CMOV_FR64: { + // To "insert" a SELECT_CC instruction, we actually have to insert the diamond + // control-flow pattern. The incoming instruction knows the destination vreg + // to set, the condition code register to branch on, the true/false values to + // select between, and a branch opcode to use. + const BasicBlock *LLVM_BB = BB->getBasicBlock(); + ilist::iterator It = BB; + ++It; - // thisMBB: - // ... - // TrueVal = ... - // cmpTY ccX, r1, r2 - // bCC copy1MBB - // fallthrough --> copy0MBB - MachineBasicBlock *thisMBB = BB; - MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB); - MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB); - unsigned Opc = getCondBrOpcodeForX86CC(MI->getOperand(3).getImmedValue()); - BuildMI(BB, Opc, 1).addMBB(sinkMBB); - MachineFunction *F = BB->getParent(); - F->getBasicBlockList().insert(It, copy0MBB); - F->getBasicBlockList().insert(It, sinkMBB); - // Update machine-CFG edges - BB->addSuccessor(copy0MBB); - BB->addSuccessor(sinkMBB); + // thisMBB: + // ... + // TrueVal = ... + // cmpTY ccX, r1, r2 + // bCC copy1MBB + // fallthrough --> copy0MBB + MachineBasicBlock *thisMBB = BB; + MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB); + MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB); + unsigned Opc = getCondBrOpcodeForX86CC(MI->getOperand(3).getImmedValue()); + BuildMI(BB, Opc, 1).addMBB(sinkMBB); + MachineFunction *F = BB->getParent(); + F->getBasicBlockList().insert(It, copy0MBB); + F->getBasicBlockList().insert(It, sinkMBB); + // Update machine-CFG edges + BB->addSuccessor(copy0MBB); + BB->addSuccessor(sinkMBB); - // copy0MBB: - // %FalseValue = ... - // # fallthrough to sinkMBB - BB = copy0MBB; + // copy0MBB: + // %FalseValue = ... + // # fallthrough to sinkMBB + BB = copy0MBB; - // Update machine-CFG edges - BB->addSuccessor(sinkMBB); + // Update machine-CFG edges + BB->addSuccessor(sinkMBB); - // sinkMBB: - // %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ] - // ... - BB = sinkMBB; - BuildMI(BB, X86::PHI, 4, MI->getOperand(0).getReg()) - .addReg(MI->getOperand(1).getReg()).addMBB(copy0MBB) - .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB); + // sinkMBB: + // %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ] + // ... + BB = sinkMBB; + BuildMI(BB, X86::PHI, 4, MI->getOperand(0).getReg()) + .addReg(MI->getOperand(1).getReg()).addMBB(copy0MBB) + .addReg(MI->getOperand(2).getReg()).addMBB(thisMBB); + + delete MI; // The pseudo instruction is gone now. + return BB; + } + + case X86::FP_TO_INT16_IN_MEM: + case X86::FP_TO_INT32_IN_MEM: + case X86::FP_TO_INT64_IN_MEM: { + // Change the floating point control register to use "round towards zero" + // mode when truncating to an integer value. + MachineFunction *F = BB->getParent(); + int CWFrameIdx = F->getFrameInfo()->CreateStackObject(2, 2); + addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx); + + // Load the old value of the high byte of the control word... + unsigned OldCW = + F->getSSARegMap()->createVirtualRegister(X86::R16RegisterClass); + addFrameReference(BuildMI(BB, X86::MOV16rm, 4, OldCW), CWFrameIdx); + + // Set the high part to be round to zero... + addFrameReference(BuildMI(BB, X86::MOV16mi, 5), CWFrameIdx).addImm(0xC7F); - delete MI; // The pseudo instruction is gone now. - return BB; + // Reload the modified control word now... + addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx); + + // Restore the memory image of control word to original value + addFrameReference(BuildMI(BB, X86::MOV16mr, 5), CWFrameIdx).addReg(OldCW); + + // Get the X86 opcode to use. + unsigned Opc; + switch (MI->getOpcode()) { + case X86::FP_TO_INT16_IN_MEM: Opc = X86::FpIST16m; break; + case X86::FP_TO_INT32_IN_MEM: Opc = X86::FpIST32m; break; + case X86::FP_TO_INT64_IN_MEM: Opc = X86::FpIST64m; break; + } + + X86AddressMode AM; + MachineOperand &Op = MI->getOperand(0); + if (Op.isRegister()) { + AM.BaseType = X86AddressMode::RegBase; + AM.Base.Reg = Op.getReg(); + } else { + AM.BaseType = X86AddressMode::FrameIndexBase; + AM.Base.FrameIndex = Op.getFrameIndex(); + } + Op = MI->getOperand(1); + if (Op.isImmediate()) + AM.Scale = Op.getImmedValue(); + Op = MI->getOperand(2); + if (Op.isImmediate()) + AM.IndexReg = Op.getImmedValue(); + Op = MI->getOperand(3); + if (Op.isGlobalAddress()) { + AM.GV = Op.getGlobal(); + } else { + AM.Disp = Op.getImmedValue(); + } + addFullAddress(BuildMI(BB, Opc, 5), AM).addReg(MI->getOperand(4).getReg()); + + // Reload the original control word now. + addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx); + + delete MI; // The pseudo instruction is gone now. + return BB; + } + } } Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.206 llvm/lib/Target/X86/X86InstrInfo.td:1.207 --- llvm/lib/Target/X86/X86InstrInfo.td:1.206 Sun Jan 15 04:05:20 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Jan 16 15:21:29 2006 @@ -52,6 +52,7 @@ SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>]>; def SDTX86Fild : SDTypeProfile<1, 2, [SDTCisVT<0, f64>, SDTCisPtrTy<1>, SDTCisVT<2, OtherVT>]>; +def SDTX86FpToIMem: SDTypeProfile<0, 2, [SDTCisFP<0>, SDTCisPtrTy<1>]>; def SDTX86RepStr : SDTypeProfile<0, 1, [SDTCisVT<0, OtherVT>]>; @@ -102,6 +103,12 @@ [SDNPHasChain]>; def X86fild : SDNode<"X86ISD::FILD", SDTX86Fild, [SDNPHasChain]>; +def X86fp_to_i16mem : SDNode<"X86ISD::FP_TO_INT16_IN_MEM", SDTX86FpToIMem, + [SDNPHasChain]>; +def X86fp_to_i32mem : SDNode<"X86ISD::FP_TO_INT32_IN_MEM", SDTX86FpToIMem, + [SDNPHasChain]>; +def X86fp_to_i64mem : SDNode<"X86ISD::FP_TO_INT64_IN_MEM", SDTX86FpToIMem, + [SDNPHasChain]>; def X86rep_stos: SDNode<"X86ISD::REP_STOS", SDTX86RepStr, [SDNPHasChain, SDNPInFlag]>; @@ -401,16 +408,32 @@ let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler. def CMOV_FR32 : I<0, Pseudo, (ops FR32:$dst, FR32:$t, FR32:$f, i8imm:$cond), - "#CMOV PSEUDO!", + "#CMOV_FR32 PSEUDO!", [(set FR32:$dst, (X86cmov FR32:$t, FR32:$f, imm:$cond, STATUS))]>; def CMOV_FR64 : I<0, Pseudo, (ops FR64:$dst, FR64:$t, FR64:$f, i8imm:$cond), - "#CMOV PSEUDO!", + "#CMOV_FR64 PSEUDO!", [(set FR64:$dst, (X86cmov FR64:$t, FR64:$f, imm:$cond, STATUS))]>; } +let usesCustomDAGSchedInserter = 1 in { // Expanded by the scheduler. + def FP_TO_INT16_IN_MEM : I<0, Pseudo, + (ops i16mem:$dst, RFP:$src), + "#FP_TO_INT16_IN_MEM PSEUDO!", + [(X86fp_to_i16mem RFP:$src, addr:$dst)]>; + def FP_TO_INT32_IN_MEM : I<0, Pseudo, + (ops i32mem:$dst, RFP:$src), + "#FP_TO_INT32_IN_MEM PSEUDO!", + [(X86fp_to_i32mem RFP:$src, addr:$dst)]>; + def FP_TO_INT64_IN_MEM : I<0, Pseudo, + (ops i64mem:$dst, RFP:$src), + "#FP_TO_INT64_IN_MEM PSEUDO!", + [(X86fp_to_i64mem RFP:$src, addr:$dst)]>; +} + + let isTerminator = 1 in let Defs = [FP0, FP1, FP2, FP3, FP4, FP5, FP6] in def FP_REG_KILL : I<0, Pseudo, (ops), "#FP_REG_KILL", []>; From alenhar2 at cs.uiuc.edu Mon Jan 16 15:22:50 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 16 Jan 2006 15:22:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp AlphaISelLowering.cpp AlphaInstrFormats.td Message-ID: <200601162122.PAA21741@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelDAGToDAG.cpp updated: 1.27 -> 1.28 AlphaISelLowering.cpp updated: 1.22 -> 1.23 AlphaInstrFormats.td updated: 1.22 -> 1.23 --- Log message: stack and rpcc --- Diffs of the changes: (+11 -35) AlphaISelDAGToDAG.cpp | 36 +++++------------------------------- AlphaISelLowering.cpp | 5 ++++- AlphaInstrFormats.td | 5 ++--- 3 files changed, 11 insertions(+), 35 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp diff -u llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.27 llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.28 --- llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp:1.27 Fri Jan 6 13:41:51 2006 +++ llvm/lib/Target/Alpha/AlphaISelDAGToDAG.cpp Mon Jan 16 15:22:38 2006 @@ -163,37 +163,6 @@ case ISD::TAILCALL: case ISD::CALL: return SelectCALL(Op); - case ISD::DYNAMIC_STACKALLOC: { - if (!isa(N->getOperand(2)) || - cast(N->getOperand(2))->getValue() != 0) { - std::cerr << "Cannot allocate stack object with greater alignment than" - << " the stack alignment yet!"; - abort(); - } - - SDOperand Chain = Select(N->getOperand(0)); - SDOperand Amt = Select(N->getOperand(1)); - SDOperand Reg = CurDAG->getRegister(Alpha::R30, MVT::i64); - SDOperand Val = CurDAG->getCopyFromReg(Chain, Alpha::R30, MVT::i64); - Chain = Val.getValue(1); - - // Subtract the amount (guaranteed to be a multiple of the stack alignment) - // from the stack pointer, giving us the result pointer. - SDOperand Result = CurDAG->getTargetNode(Alpha::SUBQ, MVT::i64, Val, Amt); - - // Copy this result back into R30. - Chain = CurDAG->getNode(ISD::CopyToReg, MVT::Other, Chain, Reg, Result); - - // Copy this result back out of R30 to make sure we're not using the stack - // space without decrementing the stack pointer. - Result = CurDAG->getCopyFromReg(Chain, Alpha::R30, MVT::i64); - - // Finally, replace the DYNAMIC_STACKALLOC with the copyfromreg. - CodeGenMap[Op.getValue(0)] = Result; - CodeGenMap[Op.getValue(1)] = Result.getValue(1); - return SDOperand(Result.Val, Op.ResNo); - } - case ISD::FrameIndex: { int FI = cast(N)->getIndex(); return CurDAG->SelectNodeTo(N, Alpha::LDA, MVT::i64, @@ -218,6 +187,11 @@ return CurDAG->SelectNodeTo(N, Alpha::BIS, MVT::i64, Chain, Chain); } + case ISD::READCYCLECOUNTER: { + SDOperand Chain = Select(N->getOperand(0)); //Select chain + return CurDAG->SelectNodeTo(N, Alpha::RPCC, MVT::i64, Chain); + } + case ISD::RET: { SDOperand Chain = Select(N->getOperand(0)); // Token chain. SDOperand InFlag; Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.22 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.23 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.22 Mon Jan 16 13:53:25 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Mon Jan 16 15:22:38 2006 @@ -112,7 +112,8 @@ // Not implemented yet. setOperationAction(ISD::STACKSAVE, MVT::Other, Expand); setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand); - + setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i64, Expand); + // We want to legalize GlobalAddress and ConstantPool and // ExternalSymbols nodes into the appropriate instructions to // materialize the address. @@ -120,6 +121,8 @@ setOperationAction(ISD::ConstantPool, MVT::i64, Custom); setOperationAction(ISD::ExternalSymbol, MVT::i64, Custom); + setStackPointerRegisterToSaveRestore(Alpha::R30); + addLegalFPImmediate(+0.0); //F31 addLegalFPImmediate(-0.0); //-F31 Index: llvm/lib/Target/Alpha/AlphaInstrFormats.td diff -u llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.22 llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.23 --- llvm/lib/Target/Alpha/AlphaInstrFormats.td:1.22 Sun Jan 1 16:16:14 2006 +++ llvm/lib/Target/Alpha/AlphaInstrFormats.td Mon Jan 16 15:22:38 2006 @@ -65,12 +65,11 @@ let Inst{15-0} = disp; } class MfcForm opcode, bits<16> fc, string asmstr> - : InstAlpha { + : InstAlpha { bits<5> Ra; - bits<5> Rb; let Inst{25-21} = Ra; - let Inst{20-16} = Rb; + let Inst{20-16} = 0; let Inst{15-0} = fc; } From alenhar2 at cs.uiuc.edu Mon Jan 16 15:22:53 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 16 Jan 2006 15:22:53 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/rpcc.ll Message-ID: <200601162122.PAA21748@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Alpha: rpcc.ll updated: 1.2 -> 1.3 --- Log message: this is fixed --- Diffs of the changes: (+0 -1) rpcc.ll | 1 - 1 files changed, 1 deletion(-) Index: llvm/test/Regression/CodeGen/Alpha/rpcc.ll diff -u llvm/test/Regression/CodeGen/Alpha/rpcc.ll:1.2 llvm/test/Regression/CodeGen/Alpha/rpcc.ll:1.3 --- llvm/test/Regression/CodeGen/Alpha/rpcc.ll:1.2 Mon Jan 16 10:34:39 2006 +++ llvm/test/Regression/CodeGen/Alpha/rpcc.ll Mon Jan 16 15:22:42 2006 @@ -1,5 +1,4 @@ ; RUN: llvm-as < %s | llc -march=alpha | grep rpcc -; XFAIL: * declare ulong %llvm.readcyclecounter() From alenhar2 at cs.uiuc.edu Mon Jan 16 15:41:51 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Mon, 16 Jan 2006 15:41:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaInstrInfo.td Message-ID: <200601162141.PAA21863@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaInstrInfo.td updated: 1.101 -> 1.102 --- Log message: fix short immediate loads --- Diffs of the changes: (+1 -1) AlphaInstrInfo.td | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.101 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.102 --- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.101 Tue Jan 10 21:33:06 2006 +++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Mon Jan 16 15:41:39 2006 @@ -826,7 +826,7 @@ def : Pat<(i64 immSExt16int:$imm), (ZAPNOTi (LDA (SExt16 immSExt16int:$imm), R31), 15)>; def : Pat<(i64 immConst2PartInt:$imm), - (ZAPNOTi (LDA (LL16 (SExt16 immConst2PartInt:$imm)), + (ZAPNOTi (LDA (LL16 (SExt32 immConst2PartInt:$imm)), (LDAH (LH16 (SExt32 immConst2PartInt:$imm)), R31)), 15)>; From reid at x10sys.com Mon Jan 16 16:21:26 2006 From: reid at x10sys.com (Reid Spencer) Date: Mon, 16 Jan 2006 16:21:26 -0600 Subject: [llvm-commits] CVS: llvm-gcc/gcc/llvm-expand.c Message-ID: <200601162221.QAA22306@zion.cs.uiuc.edu> Changes in directory llvm-gcc/gcc: llvm-expand.c updated: 1.124 -> 1.125 --- Log message: For PR411: http://llvm.cs.uiuc.edu/PR411 : Cause llvm-gcc to emit the non-overloaded form of the intrinsics for ctpop, cttz, ctlz, isunordered, and sqrt. --- Diffs of the changes: (+50 -7) llvm-expand.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 50 insertions(+), 7 deletions(-) Index: llvm-gcc/gcc/llvm-expand.c diff -u llvm-gcc/gcc/llvm-expand.c:1.124 llvm-gcc/gcc/llvm-expand.c:1.125 --- llvm-gcc/gcc/llvm-expand.c:1.124 Mon Jan 9 13:42:32 2006 +++ llvm-gcc/gcc/llvm-expand.c Mon Jan 16 16:21:14 2006 @@ -419,7 +419,7 @@ FnTy->Elements[2] = FloatTy; FnTy = llvm_type_get_cannonical_function(FnTy); llvm_isunordered_float_fn = - G2V(CreateIntrinsicFnWithType("llvm.isunordered", FnTy)); + G2V(CreateIntrinsicFnWithType("llvm.isunordered.f32", FnTy)); } I->Operands[0] = llvm_isunordered_float_fn; @@ -431,7 +431,7 @@ FnTy->Elements[2] = DoubleTy; FnTy = llvm_type_get_cannonical_function(FnTy); llvm_isunordered_double_fn = - G2V(CreateIntrinsicFnWithType("llvm.isunordered", FnTy)); + G2V(CreateIntrinsicFnWithType("llvm.isunordered.f64", FnTy)); } I->Operands[0] = llvm_isunordered_double_fn; @@ -4759,7 +4759,15 @@ case BUILT_IN_SQRTL: /* If errno math has been disabled, expand these to llvm.sqrt calls. */ if (!flag_errno_math) { - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.sqrt"); + Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + switch (Op0->Ty->ID) { + case FloatTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist,"llvm.sqrt.f32"); + case DoubleTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist,"llvm.sqrt.f64"); + default: + abort(); /* shouldn't happen */ + } } else { /* Otherwise, expand as a call to sqrt*. */ return llvm_expand_call (Fn, exp, DestLoc); @@ -4941,16 +4949,51 @@ case BUILT_IN_CLZ: case BUILT_IN_CLZL: case BUILT_IN_CLZLL: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz"); + Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + switch (Op0->Ty->ID) { + case UByteTyID: case SByteTyID: /* 8 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i8"); + case UShortTyID: case ShortTyID: /* 16 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i16"); + case UIntTyID: case IntTyID: /* 32 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i32"); + case ULongTyID: case LongTyID: /* 64 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i64"); + default: + abort(); /* this shouldn't happen? */ + } case BUILT_IN_CTZ: case BUILT_IN_CTZL: case BUILT_IN_CTZLL: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz"); - + Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + switch (Op0->Ty->ID) { + case UByteTyID: case SByteTyID: /* 8 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i8"); + case UShortTyID: case ShortTyID: /* 16 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i16"); + case UIntTyID: case IntTyID: /* 32 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i32"); + case ULongTyID: case LongTyID: /* 64 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i64"); + default: + abort(); /* this shouldn't happen? */ + } case BUILT_IN_POPCOUNT: case BUILT_IN_POPCOUNTL: case BUILT_IN_POPCOUNTLL: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop"); + Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + switch (Op0->Ty->ID) { + case UByteTyID: case SByteTyID: /* 8 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i8"); + case UShortTyID: case ShortTyID: /* 16 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i16"); + case UIntTyID: case IntTyID: /* 32 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i32"); + case ULongTyID: case LongTyID: /* 64 bit types... */ + return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i64"); + default: + abort(); /* this shouldn't happen? */ + } #if 0 case BUILT_IN_PARITY: From lattner at cs.uiuc.edu Mon Jan 16 16:34:26 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 16:34:26 -0600 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200601162234.QAA22493@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.129 -> 1.130 --- Log message: Consistency --- Diffs of the changes: (+6 -6) LangRef.html | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.129 llvm/docs/LangRef.html:1.130 --- llvm/docs/LangRef.html:1.129 Mon Jan 16 15:14:01 2006 +++ llvm/docs/LangRef.html Mon Jan 16 16:34:14 2006 @@ -155,9 +155,9 @@
  • Bit Manipulation Intrinsics
    1. 'llvm.bswap.*' Intrinsics
    2. -
    3. 'llvm.ctpop' Intrinsic
    4. -
    5. 'llvm.ctlz' Intrinsic
    6. -
    7. 'llvm.cttz' Intrinsic
    8. +
    9. 'llvm.ctpop.*' Intrinsic
    10. +
    11. 'llvm.ctlz.*' Intrinsic
    12. +
    13. 'llvm.cttz.*' Intrinsic
  • Debugger intrinsics
  • @@ -3549,7 +3549,7 @@
    @@ -3589,7 +3589,7 @@
    @@ -3650,7 +3650,7 @@ Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/01/16 21:14:01 $ + Last modified: $Date: 2006/01/16 22:34:14 $ From lattner at cs.uiuc.edu Mon Jan 16 16:39:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 16:39:11 -0600 Subject: [llvm-commits] CVS: llvm/docs/LangRef.html Message-ID: <200601162239.QAA22556@zion.cs.uiuc.edu> Changes in directory llvm/docs: LangRef.html updated: 1.130 -> 1.131 --- Log message: like bswap, the ct* intrinsics require unsigned operands --- Diffs of the changes: (+27 -27) LangRef.html | 54 +++++++++++++++++++++++++++--------------------------- 1 files changed, 27 insertions(+), 27 deletions(-) Index: llvm/docs/LangRef.html diff -u llvm/docs/LangRef.html:1.130 llvm/docs/LangRef.html:1.131 --- llvm/docs/LangRef.html:1.130 Mon Jan 16 16:34:14 2006 +++ llvm/docs/LangRef.html Mon Jan 16 16:38:59 2006 @@ -147,8 +147,8 @@
  • 'llvm.memcpy' Intrinsic
  • 'llvm.memmove' Intrinsic
  • 'llvm.memset' Intrinsic
  • -
  • 'llvm.isunordered' Intrinsic
  • -
  • 'llvm.sqrt' Intrinsic
  • +
  • 'llvm.isunordered.*' Intrinsic
  • +
  • 'llvm.sqrt.*' Intrinsic
  • @@ -3429,7 +3429,7 @@
    @@ -3485,9 +3485,9 @@
    Syntax:
    -  declare ushort %llvm.bswap.i16( ushort <id> )
    -  declare uint %llvm.bswap.i32( uint <id> )
    -  declare ulong %llvm.bswap.i64( ulong <id> )
    +  declare ushort %llvm.bswap.i16(ushort <id>)
    +  declare uint   %llvm.bswap.i32(uint <id>)
    +  declare ulong  %llvm.bswap.i64(ulong <id>)
     
    Overview:
    @@ -3501,11 +3501,11 @@
    Semantics:

    -The llvm.bswap.16 intrinsic returns a ushort value that has the high and low -byte of the input ushort swapped. Similarly, the llvm.bswap.i32 intrinsic +The llvm.bswap.16 intrinsic returns a ushort value that has the high and low +byte of the input ushort swapped. Similarly, the llvm.bswap.i32 intrinsic returns a uint value that has the four bytes of the input uint swapped, so that if the input bytes are numbered 0, 1, 2, 3 then the returned uint will have its -bytes in 3, 2, 1, 0 order. The llvm.bswap.i64 intrinsic extends this concept +bytes in 3, 2, 1, 0 order. The llvm.bswap.i64 intrinsic extends this concept to 64 bits.

    @@ -3520,24 +3520,24 @@
    Syntax:
    -  declare sbyte %llvm.ctpop.i8(sbyte <src>)
    -  declare short %llvm.ctpop.i16(short <src>)
    -  declare int   %llvm.ctpop.i32(int <src>)
    -  declare long  %llvm.ctpop.i64(long <src>)
    +  declare ubyte  %llvm.ctpop.i8 (ubyte <src>)
    +  declare ushort %llvm.ctpop.i16(ushort <src>)
    +  declare uint   %llvm.ctpop.i32(uint <src>)
    +  declare ulong  %llvm.ctpop.i64(ulong <src>)
     
    Overview:

    -The 'llvm.ctpop' family of intrinsics counts the number of ones in a -variable. +The 'llvm.ctpop' family of intrinsics counts the number of bits set in a +value.

    Arguments:

    The only argument is the value to be counted. The argument may be of any -integer type. The return type must match the argument type. +unsigned integer type. The return type must match the argument type.

    Semantics:
    @@ -3556,10 +3556,10 @@
    Syntax:
    -  declare sbyte %llvm.ctlz.i8(sbyte <src>)
    -  declare short %llvm.ctlz.i16(short <src>)
    -  declare int   %llvm.ctlz.i32(int <src>)
    -  declare long  %llvm.ctlz.i64(long <src>)
    +  declare ubyte  %llvm.ctlz.i8 (ubyte <src>)
    +  declare ushort %llvm.ctlz.i16(ushort <src>)
    +  declare uint   %llvm.ctlz.i32(uint <src>)
    +  declare ulong  %llvm.ctlz.i64(ulong <src>)
     
    Overview:
    @@ -3573,7 +3573,7 @@

    The only argument is the value to be counted. The argument may be of any -integer type. The return type must match the argument type. +unsigned integer type. The return type must match the argument type.

    Semantics:
    @@ -3596,10 +3596,10 @@
    Syntax:
    -  declare sbyte %llvm.cttz.i8(sbyte <src>)
    -  declare short %llvm.cttz.i16(short <src>)
    -  declare int   %llvm.cttz.i32(int <src>)
    -  declare long  %llvm.cttz.i64(long <src>)
    +  declare ubyte  %llvm.cttz.i8 (ubyte <src>)
    +  declare ushort %llvm.cttz.i16(ushort <src>)
    +  declare uint   %llvm.cttz.i32(uint <src>)
    +  declare ulong  %llvm.cttz.i64(ulong <src>)
     
    Overview:
    @@ -3613,7 +3613,7 @@

    The only argument is the value to be counted. The argument may be of any -integer type. The return type must match the argument type. +unsigned integer type. The return type must match the argument type.

    Semantics:
    @@ -3650,7 +3650,7 @@ Chris Lattner
    The LLVM Compiler Infrastructure
    - Last modified: $Date: 2006/01/16 22:34:14 $ + Last modified: $Date: 2006/01/16 22:38:59 $ From evan.cheng at apple.com Mon Jan 16 16:48:58 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 16:48:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200601162248.QAA22635@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.207 -> 1.208 --- Log message: Some typo's --- Diffs of the changes: (+12 -13) X86InstrInfo.td | 25 ++++++++++++------------- 1 files changed, 12 insertions(+), 13 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.207 llvm/lib/Target/X86/X86InstrInfo.td:1.208 --- llvm/lib/Target/X86/X86InstrInfo.td:1.207 Mon Jan 16 15:21:29 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Jan 16 16:48:46 2006 @@ -2686,42 +2686,42 @@ [(set RFP:$dst, (fadd RFP:$src1, (extloadf64f32 addr:$src2)))]>; // ST(0) = ST(0) + [mem32] -def FpADD64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, +def FpADD64m : FpI<(ops RFP:$dst, RFP:$src1, f64mem:$src2), OneArgFPRW, [(set RFP:$dst, (fadd RFP:$src1, (loadf64 addr:$src2)))]>; // ST(0) = ST(0) + [mem64] def FpMUL32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fmul RFP:$src1, (extloadf64f32 addr:$src2)))]>; // ST(0) = ST(0) * [mem32] -def FpMUL64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, +def FpMUL64m : FpI<(ops RFP:$dst, RFP:$src1, f64mem:$src2), OneArgFPRW, [(set RFP:$dst, (fmul RFP:$src1, (loadf64 addr:$src2)))]>; // ST(0) = ST(0) * [mem64] def FpSUB32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fsub RFP:$src1, (extloadf64f32 addr:$src2)))]>; // ST(0) = ST(0) - [mem32] -def FpSUB64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, +def FpSUB64m : FpI<(ops RFP:$dst, RFP:$src1, f64mem:$src2), OneArgFPRW, [(set RFP:$dst, (fsub RFP:$src1, (loadf64 addr:$src2)))]>; // ST(0) = ST(0) - [mem64] def FpSUBR32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fsub (extloadf64f32 addr:$src2), RFP:$src1))]>; // ST(0) = [mem32] - ST(0) -def FpSUBR64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, +def FpSUBR64m : FpI<(ops RFP:$dst, RFP:$src1, f64mem:$src2), OneArgFPRW, [(set RFP:$dst, (fsub (loadf64 addr:$src2), RFP:$src1))]>; // ST(0) = [mem64] - ST(0) def FpDIV32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fdiv RFP:$src1, (extloadf64f32 addr:$src2)))]>; // ST(0) = ST(0) / [mem32] -def FpDIV64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, +def FpDIV64m : FpI<(ops RFP:$dst, RFP:$src1, f64mem:$src2), OneArgFPRW, [(set RFP:$dst, (fdiv RFP:$src1, (loadf64 addr:$src2)))]>; // ST(0) = ST(0) / [mem64] def FpDIVR32m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fdiv (extloadf64f32 addr:$src2), RFP:$src1))]>; // ST(0) = [mem32] / ST(0) -def FpDIVR64m : FpI<(ops RFP:$dst, RFP:$src1, f32mem:$src2), OneArgFPRW, +def FpDIVR64m : FpI<(ops RFP:$dst, RFP:$src1, f64mem:$src2), OneArgFPRW, [(set RFP:$dst, (fdiv (loadf64 addr:$src2), RFP:$src1))]>; // ST(0) = [mem64] / ST(0) @@ -2739,12 +2739,11 @@ def FDIVR32m : FPI<0xD8, MRM7m, (ops f32mem:$src), "fdivr{s} $src">; def FDIVR64m : FPI<0xDC, MRM7m, (ops f64mem:$src), "fdivr{l} $src">; -// FIXME: Implement these when we have a dag-dag isel! def FpIADD16m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, [(set RFP:$dst, (fadd RFP:$src1, (X86fild addr:$src2, i16)))]>; // ST(0) = ST(0) + [mem16int] -def FpIADD32m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, +def FpIADD32m : FpI<(ops RFP:$dst, RFP:$src1, i32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fadd RFP:$src1, (X86fild addr:$src2, i32)))]>; // ST(0) = ST(0) + [mem32int] @@ -2752,7 +2751,7 @@ [(set RFP:$dst, (fmul RFP:$src1, (X86fild addr:$src2, i16)))]>; // ST(0) = ST(0) * [mem16int] -def FpIMUL32m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, +def FpIMUL32m : FpI<(ops RFP:$dst, RFP:$src1, i32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fmul RFP:$src1, (X86fild addr:$src2, i32)))]>; // ST(0) = ST(0) * [mem32int] @@ -2760,7 +2759,7 @@ [(set RFP:$dst, (fsub RFP:$src1, (X86fild addr:$src2, i16)))]>; // ST(0) = ST(0) - [mem16int] -def FpISUB32m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, +def FpISUB32m : FpI<(ops RFP:$dst, RFP:$src1, i32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fsub RFP:$src1, (X86fild addr:$src2, i32)))]>; // ST(0) = ST(0) - [mem32int] @@ -2768,7 +2767,7 @@ [(set RFP:$dst, (fsub (X86fild addr:$src2, i16), RFP:$src1))]>; // ST(0) = [mem16int] - ST(0) -def FpISUBR32m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, +def FpISUBR32m : FpI<(ops RFP:$dst, RFP:$src1, i32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fsub (X86fild addr:$src2, i32), RFP:$src1))]>; // ST(0) = [mem32int] - ST(0) @@ -2776,7 +2775,7 @@ [(set RFP:$dst, (fdiv RFP:$src1, (X86fild addr:$src2, i16)))]>; // ST(0) = ST(0) / [mem16int] -def FpIDIV32m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, +def FpIDIV32m : FpI<(ops RFP:$dst, RFP:$src1, i32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fdiv RFP:$src1, (X86fild addr:$src2, i32)))]>; // ST(0) = ST(0) / [mem32int] @@ -2784,7 +2783,7 @@ [(set RFP:$dst, (fdiv (X86fild addr:$src2, i16), RFP:$src1))]>; // ST(0) = [mem16int] / ST(0) -def FpIDIVR32m : FpI<(ops RFP:$dst, RFP:$src1, i16mem:$src2), OneArgFPRW, +def FpIDIVR32m : FpI<(ops RFP:$dst, RFP:$src1, i32mem:$src2), OneArgFPRW, [(set RFP:$dst, (fdiv (X86fild addr:$src2, i32), RFP:$src1))]>; // ST(0) = [mem32int] / ST(0) From evan.cheng at apple.com Mon Jan 16 17:27:05 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 17:27:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200601162327.RAA22997@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.208 -> 1.209 --- Log message: More typo's --- Diffs of the changes: (+2 -2) X86InstrInfo.td | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.208 llvm/lib/Target/X86/X86InstrInfo.td:1.209 --- llvm/lib/Target/X86/X86InstrInfo.td:1.208 Mon Jan 16 16:48:46 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Jan 16 17:26:53 2006 @@ -2797,9 +2797,9 @@ def FISUBR16m : FPI<0xDE, MRM5m, (ops i16mem:$src), "fisubr{s} $src">; def FISUBR32m : FPI<0xDA, MRM5m, (ops i32mem:$src), "fisubr{l} $src">; def FIDIV16m : FPI<0xDE, MRM6m, (ops i16mem:$src), "fidiv{s} $src">; -def FIDIV32m : FPI<0xDA, MRM6m, (ops i32mem:$src), "fidiv{s} $src">; +def FIDIV32m : FPI<0xDA, MRM6m, (ops i32mem:$src), "fidiv{l} $src">; def FIDIVR16m : FPI<0xDE, MRM7m, (ops i16mem:$src), "fidivr{s} $src">; -def FIDIVR32m : FPI<0xDA, MRM7m, (ops i32mem:$src), "fidivr{s} $src">; +def FIDIVR32m : FPI<0xDA, MRM7m, (ops i32mem:$src), "fidivr{l} $src">; // NOTE: GAS and apparently all other AT&T style assemblers have a broken notion // of some of the 'reverse' forms of the fsub and fdiv instructions. As such, From jlaskey at apple.com Mon Jan 16 17:29:55 2006 From: jlaskey at apple.com (Jim Laskey) Date: Mon, 16 Jan 2006 17:29:55 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200601162329.RAA23070@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h added (r1.1) --- Log message: UniqueVector template provides a means of enumerating objects uniquely. --- Diffs of the changes: (+70 -0) UniqueVector.h | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 70 insertions(+) Index: llvm/include/llvm/ADT/UniqueVector.h diff -c /dev/null llvm/include/llvm/ADT/UniqueVector.h:1.1 *** /dev/null Mon Jan 16 17:29:53 2006 --- llvm/include/llvm/ADT/UniqueVector.h Mon Jan 16 17:29:43 2006 *************** *** 0 **** --- 1,70 ---- + + //===-- llvm/ADT/UniqueVector.h ---------------------------------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by James M. Laskey and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_ADT_UNIQUEVECTOR_H + #define LLVM_ADT_UNIQUEVECTOR_H + + #include + #include + + namespace llvm { + + //===----------------------------------------------------------------------===// + /// UniqueVector - This class produces a sequential ID number (base 1) for each + /// unique entry that is added. This class also provides an ID ordered vector + /// of the entries (indexed by ID - 1.) T is the type of entries in the vector. + /// This class should have an implementation of operator== and of operator<. + template class UniqueVector { + private: + // Map - Used to handle the correspondence of entry to ID. + typename std::map Map; + + // Vector - ID ordered vector of entries. Entries can be indexed by ID - 1. + // + typename std::vector Vector; + + public: + /// insert - Append entry to the vector if it doesn't already exist. Returns + /// the entry's index + 1 to be used as a unique ID. + unsigned insert(const T &Entry) { + // Check if the entry is already in the map. + typename std::map::iterator MI = Map.lower_bound(Entry); + + // See if entry exists, if so return prior ID. + if (MI != Map.end() && MI->first == Entry) return MI->second; + + // Compute ID for entry. + unsigned ID = Vector.size() + 1; + + // Insert in map. + Map.insert(MI, std::make_pair(Entry, ID)); + + // Insert in vector. + Vector.push_back(Entry); + + return ID; + } + + /// operator[] - Returns a reference to the entry with the specified ID. + /// + const T &operator[](unsigned ID) const { return Vector[ID - 1]; } + + /// size - Returns the number of entries in the vector. + /// + size_t size() const { return Vector.size(); } + + /// getVector - Return the ID ordered vector of entries. + /// + inline const typename std::vector &getVector() const { return Vector; } + }; + + } // End of namespace llvm + + #endif // LLVM_ADT_UNIQUEVECTOR_H \ No newline at end of file From jlaskey at apple.com Mon Jan 16 17:44:15 2006 From: jlaskey at apple.com (Jim Laskey) Date: Mon, 16 Jan 2006 17:44:15 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200601162344.RAA23224@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h updated: 1.1 -> 1.2 --- Log message: Redundant inline keyword. --- Diffs of the changes: (+1 -1) UniqueVector.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/UniqueVector.h diff -u llvm/include/llvm/ADT/UniqueVector.h:1.1 llvm/include/llvm/ADT/UniqueVector.h:1.2 --- llvm/include/llvm/ADT/UniqueVector.h:1.1 Mon Jan 16 17:29:43 2006 +++ llvm/include/llvm/ADT/UniqueVector.h Mon Jan 16 17:44:03 2006 @@ -62,7 +62,7 @@ /// getVector - Return the ID ordered vector of entries. /// - inline const typename std::vector &getVector() const { return Vector; } + const typename std::vector &getVector() const { return Vector; } }; } // End of namespace llvm From evan.cheng at apple.com Mon Jan 16 18:19:58 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 18:19:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp X86InstrInfo.td Message-ID: <200601170019.SAA23333@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.43 -> 1.44 X86InstrInfo.td updated: 1.209 -> 1.210 --- Log message: Bug fixes: fpGETRESULT should produces a flag result and X86ISD::FST should read a flag. --- Diffs of the changes: (+12 -10) X86ISelLowering.cpp | 18 ++++++++++-------- X86InstrInfo.td | 4 ++-- 2 files changed, 12 insertions(+), 10 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.43 llvm/lib/Target/X86/X86ISelLowering.cpp:1.44 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.43 Mon Jan 16 15:21:29 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Jan 16 18:19:47 2006 @@ -543,16 +543,17 @@ Chain = Hi.getValue(1); break; } - case MVT::f32: case MVT::f64: { std::vector Tys; Tys.push_back(MVT::f64); Tys.push_back(MVT::Other); + Tys.push_back(MVT::Flag); std::vector Ops; Ops.push_back(Chain); Ops.push_back(InFlag); RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys, Ops); - Chain = RetVal.getValue(1); + Chain = RetVal.getValue(1); + InFlag = RetVal.getValue(2); if (X86ScalarSSE) { unsigned Size = MVT::getSizeInBits(MVT::f64)/8; MachineFunction &MF = DAG.getMachineFunction(); @@ -565,12 +566,12 @@ Ops.push_back(RetVal); Ops.push_back(StackSlot); Ops.push_back(DAG.getValueType(RetTyVT)); + Ops.push_back(InFlag); Chain = DAG.getNode(X86ISD::FST, Tys, Ops); RetVal = DAG.getLoad(RetTyVT, Chain, StackSlot, DAG.getSrcValue(NULL)); Chain = RetVal.getValue(1); - } else if (RetTyVT == MVT::f32) - RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal); + } break; } } @@ -1059,16 +1060,17 @@ Chain = Hi.getValue(1); break; } - case MVT::f32: case MVT::f64: { std::vector Tys; Tys.push_back(MVT::f64); Tys.push_back(MVT::Other); + Tys.push_back(MVT::Flag); std::vector Ops; Ops.push_back(Chain); Ops.push_back(InFlag); RetVal = DAG.getNode(X86ISD::FP_GET_RESULT, Tys, Ops); - Chain = RetVal.getValue(1); + Chain = RetVal.getValue(1); + InFlag = RetVal.getValue(2); if (X86ScalarSSE) { unsigned Size = MVT::getSizeInBits(MVT::f64)/8; MachineFunction &MF = DAG.getMachineFunction(); @@ -1081,12 +1083,12 @@ Ops.push_back(RetVal); Ops.push_back(StackSlot); Ops.push_back(DAG.getValueType(RetTyVT)); + Ops.push_back(InFlag); Chain = DAG.getNode(X86ISD::FST, Tys, Ops); RetVal = DAG.getLoad(RetTyVT, Chain, StackSlot, DAG.getSrcValue(NULL)); Chain = RetVal.getValue(1); - } else if (RetTyVT == MVT::f32) - RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal); + } break; } } Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.209 llvm/lib/Target/X86/X86InstrInfo.td:1.210 --- llvm/lib/Target/X86/X86InstrInfo.td:1.209 Mon Jan 16 17:26:53 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Mon Jan 16 18:19:47 2006 @@ -93,14 +93,14 @@ [SDNPHasChain, SDNPOutFlag, SDNPOptInFlag]>; def X86fpget : SDNode<"X86ISD::FP_GET_RESULT", SDTX86FpGet, - [SDNPHasChain, SDNPInFlag]>; + [SDNPHasChain, SDNPInFlag, SDNPOutFlag]>; def X86fpset : SDNode<"X86ISD::FP_SET_RESULT", SDTX86FpSet, [SDNPHasChain, SDNPOutFlag]>; def X86fld : SDNode<"X86ISD::FLD", SDTX86Fld, [SDNPHasChain]>; def X86fst : SDNode<"X86ISD::FST", SDTX86Fst, - [SDNPHasChain]>; + [SDNPHasChain, SDNPInFlag]>; def X86fild : SDNode<"X86ISD::FILD", SDTX86Fild, [SDNPHasChain]>; def X86fp_to_i16mem : SDNode<"X86ISD::FP_TO_INT16_IN_MEM", SDTX86FpToIMem, From lattner at cs.uiuc.edu Mon Jan 16 18:32:40 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 18:32:40 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/CommandLine.cpp ToolRunner.cpp Message-ID: <200601170032.SAA23416@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: CommandLine.cpp updated: 1.65 -> 1.66 ToolRunner.cpp updated: 1.46 -> 1.47 --- Log message: Add support for programs with a null argv[0] --- Diffs of the changes: (+32 -10) CommandLine.cpp | 34 ++++++++++++++++++++++++---------- ToolRunner.cpp | 8 ++++++++ 2 files changed, 32 insertions(+), 10 deletions(-) Index: llvm/lib/Support/CommandLine.cpp diff -u llvm/lib/Support/CommandLine.cpp:1.65 llvm/lib/Support/CommandLine.cpp:1.66 --- llvm/lib/Support/CommandLine.cpp:1.65 Sun Dec 25 22:56:16 2005 +++ llvm/lib/Support/CommandLine.cpp Mon Jan 16 18:32:28 2006 @@ -448,8 +448,11 @@ } if (Handler == 0) { - std::cerr << ProgramName << ": Unknown command line argument '" << argv[i] - << "'. Try: '" << argv[0] << " --help'\n"; + if (ProgramName) + std::cerr << ProgramName << ": Unknown command line argument '" + << argv[i] << "'. Try: '" << argv[0] << " --help'\n"; + else + std::cerr << "Unknown command line argument '" << argv[i] << "'.\n"; ErrorParsing = true; continue; } @@ -485,17 +488,28 @@ // Check and handle positional arguments now... if (NumPositionalRequired > PositionalVals.size()) { - std::cerr << ProgramName - << ": Not enough positional command line arguments specified!\n" - << "Must specify at least " << NumPositionalRequired - << " positional arguments: See: " << argv[0] << " --help\n"; + if (ProgramName) + std::cerr << ProgramName + << ": Not enough positional command line arguments specified!\n" + << "Must specify at least " << NumPositionalRequired + << " positional arguments: See: " << argv[0] << " --help\n"; + else + std::cerr << "Not enough positional command line arguments specified!\n" + << "Must specify at least " << NumPositionalRequired + << " positional arguments."; + ErrorParsing = true; } else if (!HasUnlimitedPositionals && PositionalVals.size() > PositionalOpts.size()) { - std::cerr << ProgramName - << ": Too many positional arguments specified!\n" - << "Can specify at most " << PositionalOpts.size() - << " positional arguments: See: " << argv[0] << " --help\n"; + if (ProgramName) + std::cerr << ProgramName + << ": Too many positional arguments specified!\n" + << "Can specify at most " << PositionalOpts.size() + << " positional arguments: See: " << argv[0] << " --help\n"; + else + std::cerr << "Too many positional arguments specified!\n" + << "Can specify at most " << PositionalOpts.size() + << " positional arguments.\n"; ErrorParsing = true; } else if (ConsumeAfterOpt == 0) { Index: llvm/lib/Support/ToolRunner.cpp diff -u llvm/lib/Support/ToolRunner.cpp:1.46 llvm/lib/Support/ToolRunner.cpp:1.47 --- llvm/lib/Support/ToolRunner.cpp:1.46 Mon Aug 29 08:14:24 2005 +++ llvm/lib/Support/ToolRunner.cpp Mon Jan 16 18:32:28 2006 @@ -394,7 +394,15 @@ sys::Path OutputBinary (ProgramFile+".gcc.exe"); OutputBinary.makeUnique(); GCCArgs.push_back(OutputBinary.c_str()); // Output to the right file... + GCCArgs.push_back("-lz"); GCCArgs.push_back("-lm"); // Hard-code the math library... + GCCArgs.push_back("-x"); + GCCArgs.push_back("none"); + GCCArgs.push_back("/usr/local/lib/NAGWare/quickfit.o"); + GCCArgs.push_back("-Xlinker"); + GCCArgs.push_back("-flat_namespace"); + GCCArgs.push_back("/usr/local/lib/NAGWare/libf97.dylib"); + GCCArgs.push_back("/usr/local/lib/NAGWare/libf96.a"); GCCArgs.push_back("-O2"); // Optimize the program a bit... #if defined (HAVE_LINK_R) GCCArgs.push_back("-Wl,-R."); // Search this dir for .so files From evan.cheng at apple.com Mon Jan 16 18:32:49 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 18:32:49 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/SelectionDAG.h Message-ID: <200601170032.SAA23423@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: SelectionDAG.h updated: 1.84 -> 1.85 --- Log message: Yet another getTargetNode() variant. I promise one of these days I'll fix tblgen so this is unnecessary. --- Diffs of the changes: (+12 -0) SelectionDAG.h | 12 ++++++++++++ 1 files changed, 12 insertions(+) Index: llvm/include/llvm/CodeGen/SelectionDAG.h diff -u llvm/include/llvm/CodeGen/SelectionDAG.h:1.84 llvm/include/llvm/CodeGen/SelectionDAG.h:1.85 --- llvm/include/llvm/CodeGen/SelectionDAG.h:1.84 Mon Jan 9 12:29:18 2006 +++ llvm/include/llvm/CodeGen/SelectionDAG.h Mon Jan 16 18:32:38 2006 @@ -476,6 +476,18 @@ } SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1, MVT::ValueType VT2, MVT::ValueType VT3, + SDOperand Op1, SDOperand Op2) { + std::vector ResultTys; + ResultTys.push_back(VT1); + ResultTys.push_back(VT2); + ResultTys.push_back(VT3); + std::vector Ops; + Ops.push_back(Op1); + Ops.push_back(Op2); + return getNode(ISD::BUILTIN_OP_END+Opcode, ResultTys, Ops); + } + SDOperand getTargetNode(unsigned Opcode, MVT::ValueType VT1, + MVT::ValueType VT2, MVT::ValueType VT3, SDOperand Op1, SDOperand Op2, SDOperand Op3, SDOperand Op4, SDOperand Op5, SDOperand Op6) { From evan.cheng at apple.com Mon Jan 16 18:37:54 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 18:37:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601170037.SAA23443@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.44 -> 1.45 --- Log message: Added a FIXME comment about why FST is currently flagged to fpGETRESULT. --- Diffs of the changes: (+6 -0) X86ISelLowering.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.44 llvm/lib/Target/X86/X86ISelLowering.cpp:1.45 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.44 Mon Jan 16 18:19:47 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Jan 16 18:37:42 2006 @@ -555,6 +555,9 @@ Chain = RetVal.getValue(1); InFlag = RetVal.getValue(2); if (X86ScalarSSE) { + // FIXME:Currently the FST is flagged to the FP_GET_RESULT. This + // shouldn't be necessary except for RFP cannot be live across + // multiple blocks. When stackifier is fixed, they can be uncoupled. unsigned Size = MVT::getSizeInBits(MVT::f64)/8; MachineFunction &MF = DAG.getMachineFunction(); int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); @@ -1072,6 +1075,9 @@ Chain = RetVal.getValue(1); InFlag = RetVal.getValue(2); if (X86ScalarSSE) { + // FIXME:Currently the FST is flagged to the FP_GET_RESULT. This + // shouldn't be necessary except for RFP cannot be live across + // multiple blocks. When stackifier is fixed, they can be uncoupled. unsigned Size = MVT::getSizeInBits(MVT::f64)/8; MachineFunction &MF = DAG.getMachineFunction(); int SSFI = MF.getFrameInfo()->CreateStackObject(Size, Size); From lattner at cs.uiuc.edu Mon Jan 16 18:40:35 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 18:40:35 -0600 Subject: [llvm-commits] CVS: llvm/lib/Support/ToolRunner.cpp Message-ID: <200601170040.SAA23563@zion.cs.uiuc.edu> Changes in directory llvm/lib/Support: ToolRunner.cpp updated: 1.47 -> 1.48 --- Log message: Revert this, I didn't mean to commit it --- Diffs of the changes: (+0 -8) ToolRunner.cpp | 8 -------- 1 files changed, 8 deletions(-) Index: llvm/lib/Support/ToolRunner.cpp diff -u llvm/lib/Support/ToolRunner.cpp:1.47 llvm/lib/Support/ToolRunner.cpp:1.48 --- llvm/lib/Support/ToolRunner.cpp:1.47 Mon Jan 16 18:32:28 2006 +++ llvm/lib/Support/ToolRunner.cpp Mon Jan 16 18:40:24 2006 @@ -394,15 +394,7 @@ sys::Path OutputBinary (ProgramFile+".gcc.exe"); OutputBinary.makeUnique(); GCCArgs.push_back(OutputBinary.c_str()); // Output to the right file... - GCCArgs.push_back("-lz"); GCCArgs.push_back("-lm"); // Hard-code the math library... - GCCArgs.push_back("-x"); - GCCArgs.push_back("none"); - GCCArgs.push_back("/usr/local/lib/NAGWare/quickfit.o"); - GCCArgs.push_back("-Xlinker"); - GCCArgs.push_back("-flat_namespace"); - GCCArgs.push_back("/usr/local/lib/NAGWare/libf97.dylib"); - GCCArgs.push_back("/usr/local/lib/NAGWare/libf96.a"); GCCArgs.push_back("-O2"); // Optimize the program a bit... #if defined (HAVE_LINK_R) GCCArgs.push_back("-Wl,-R."); // Search this dir for .so files From duraid at octopus.com.au Mon Jan 16 19:20:00 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Mon, 16 Jan 2006 19:20:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Message-ID: <200601170120.TAA24190@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.23 -> 1.24 --- Log message: fixing divides --- Diffs of the changes: (+9 -12) IA64ISelDAGToDAG.cpp | 21 +++++++++------------ 1 files changed, 9 insertions(+), 12 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.23 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.24 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.23 Mon Jan 16 08:33:04 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Mon Jan 16 19:19:49 2006 @@ -228,6 +228,8 @@ TmpPR = TmpF5.getValue(1); Chain = TmpF5.getValue(2); + Chain = CurDAG->getCopyToReg(Chain, IA64::F8, TmpF5); + SDOperand minusB; if(isModulus) { // for remainders, it'll be handy to have // copies of -input_b @@ -287,23 +289,18 @@ TmpR2 = CurDAG->getTargetNode(IA64::CFNMAS1, MVT::f64, TmpF4, TmpQ2, TmpF3, TmpPR); Chain = TmpR2.getValue(1); - + // we want TmpQ3 to have the same target register as the frcpa? maybe we // should two-address hack it. See the comment "for this to work..." on page // 48 of Intel application note #245415 - TmpQ3 = CurDAG->getTargetNode(IA64::CFMAS1, MVT::f64, - TmpR2, TmpY2, TmpQ2, TmpPR); + TmpQ3 = CurDAG->getTargetNode(IA64::TCFMAS1, MVT::f64, + TmpF5, TmpR2, TmpY2, TmpQ2, TmpPR); Chain = TmpQ3.getValue(1); - // FIXME: this is unfortunate :( - // the story is that the dest reg of the fnma above and the fma below it - // (and therefore the src of the fcvt.fx[u] below as well) cannot - // be the same register, or this code breaks if the first argument is - // zero. (e.g. without this hack, 0%8 yields -64, not 0.) -/* XXX: these two lines do nothing */ - SDOperand bogus = CurDAG->getTargetNode(IA64::IUSE, MVT::Other, TmpR2); - Chain = bogus.getValue(0); - + // STORY: without these two-address instructions (TCFMAS1 and TCFMADS0) + // the FPSWA won't be able to help out in the case of large/tiny + // arguments. Other fun bugs may also appear, e.g. 0/x = x, not 0. + if(isSigned) TmpQ = CurDAG->getTargetNode(IA64::FCVTFXTRUNCS1, MVT::f64, TmpQ3); else From lattner at cs.uiuc.edu Mon Jan 16 19:20:52 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Mon, 16 Jan 2006 19:20:52 -0600 Subject: [llvm-commits] CVS: llvm-test/Makefile.tests Message-ID: <200601170120.TAA24206@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.tests updated: 1.5 -> 1.6 --- Log message: Pass -emit-llvm to llvm-gcc. This flag is ignored by the old front-end, and tells the new front-end to emit a .ll (instead of a .s file) file like the old one does. --- Diffs of the changes: (+3 -3) Makefile.tests | 6 +++--- 1 files changed, 3 insertions(+), 3 deletions(-) Index: llvm-test/Makefile.tests diff -u llvm-test/Makefile.tests:1.5 llvm-test/Makefile.tests:1.6 --- llvm-test/Makefile.tests:1.5 Tue Mar 8 16:58:33 2005 +++ llvm-test/Makefile.tests Mon Jan 16 19:20:40 2006 @@ -50,15 +50,15 @@ # Compile from X.c to Output/X.ll Output/%.ll: %.c $(LCC1) Output/.dir $(INCLUDES) - -$(LLVMGCC) $(CPPFLAGS) $(LCCFLAGS) -S $< -o $@ + -$(LLVMGCC) $(CPPFLAGS) $(LCCFLAGS) -S $< -o $@ -emit-llvm # Compile from X.cpp to Output/X.ll Output/%.ll: %.cpp $(LCC1XX) Output/.dir $(INCLUDES) - -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) -S $< -o $@ + -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) -S $< -o $@ -emit-llvm # Compile from X.cc to Output/X.ll Output/%.ll: %.cc $(LCC1XX) Output/.dir $(INCLUDES) - -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) -S $< -o $@ + -$(LLVMGXX) $(CPPFLAGS) $(LCXXFLAGS) -S $< -o $@ -emit-llvm # LLVM Assemble from Output/X.ll to Output/X.bc. Output/X.ll must have come # from GCC output, so use GCCAS. From duraid at octopus.com.au Mon Jan 16 20:05:04 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Mon, 16 Jan 2006 20:05:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64InstrInfo.td IA64RegisterInfo.cpp IA64RegisterInfo.td Message-ID: <200601170205.UAA24813@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64InstrInfo.td updated: 1.38 -> 1.39 IA64RegisterInfo.cpp updated: 1.9 -> 1.10 IA64RegisterInfo.td updated: 1.12 -> 1.13 --- Log message: use proper (82-bit) spills/fills when spilling FP regs, so that divides don't get broken. this fixes obsequi, smg2000, and probably a bunch of other stuff (tm) --- Diffs of the changes: (+11 -3) IA64InstrInfo.td | 4 ++++ IA64RegisterInfo.cpp | 4 ++-- IA64RegisterInfo.td | 6 +++++- 3 files changed, 11 insertions(+), 3 deletions(-) Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.38 llvm/lib/Target/IA64/IA64InstrInfo.td:1.39 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.38 Mon Jan 16 00:33:38 2006 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Mon Jan 16 20:04:52 2006 @@ -537,6 +537,8 @@ "stfs [$dstPtr] = $value;;">; def STF8 : AForm<0x03, 0x0b, (ops GR:$dstPtr, FP:$value), "stfd [$dstPtr] = $value;;">; + def STF_SPILL : AForm<0x03, 0x0b, (ops GR:$dstPtr, FP:$value), + "stf.spill [$dstPtr] = $value;;">; } let isLoad = 1 in { @@ -552,6 +554,8 @@ "ldfs $dst = [$srcPtr];;">; def LDF8 : AForm<0x03, 0x0b, (ops FP:$dst, GR:$srcPtr), "ldfd $dst = [$srcPtr];;">; + def LDF_FILL : AForm<0x03, 0x0b, (ops FP:$dst, GR:$srcPtr), + "ldf.fill $dst = [$srcPtr];;">; } def POPCNT : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src), Index: llvm/lib/Target/IA64/IA64RegisterInfo.cpp diff -u llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.9 llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.10 --- llvm/lib/Target/IA64/IA64RegisterInfo.cpp:1.9 Thu Oct 27 23:58:24 2005 +++ llvm/lib/Target/IA64/IA64RegisterInfo.cpp Mon Jan 16 20:04:52 2006 @@ -40,7 +40,7 @@ const TargetRegisterClass *RC) const{ if (RC == IA64::FPRegisterClass) { - BuildMI(MBB, MI, IA64::STF8, 2).addFrameIndex(FrameIdx).addReg(SrcReg); + BuildMI(MBB, MI, IA64::STF_SPILL, 2).addFrameIndex(FrameIdx).addReg(SrcReg); } else if (RC == IA64::GRRegisterClass) { BuildMI(MBB, MI, IA64::ST8, 2).addFrameIndex(FrameIdx).addReg(SrcReg); } @@ -63,7 +63,7 @@ const TargetRegisterClass *RC)const{ if (RC == IA64::FPRegisterClass) { - BuildMI(MBB, MI, IA64::LDF8, 1, DestReg).addFrameIndex(FrameIdx); + BuildMI(MBB, MI, IA64::LDF_FILL, 1, DestReg).addFrameIndex(FrameIdx); } else if (RC == IA64::GRRegisterClass) { BuildMI(MBB, MI, IA64::LD8, 1, DestReg).addFrameIndex(FrameIdx); } else if (RC == IA64::PRRegisterClass) { Index: llvm/lib/Target/IA64/IA64RegisterInfo.td diff -u llvm/lib/Target/IA64/IA64RegisterInfo.td:1.12 llvm/lib/Target/IA64/IA64RegisterInfo.td:1.13 --- llvm/lib/Target/IA64/IA64RegisterInfo.td:1.12 Wed Dec 21 21:56:03 2005 +++ llvm/lib/Target/IA64/IA64RegisterInfo.td Mon Jan 16 20:04:52 2006 @@ -282,7 +282,11 @@ // these are the scratch (+stacked) FP registers -def FP : RegisterClass<"IA64", [f64], 64, + +// the 128 here is to make stf.spill/ldf.fill happy, +// when storing full (82-bit) FP regs to stack slots +// we need to 16-byte align +def FP : RegisterClass<"IA64", [f64], 128, [F6, F7, F8, F9, F10, F11, F12, F13, F14, F15, F32, F33, F34, F35, F36, F37, F38, F39, From evan.cheng at apple.com Mon Jan 16 20:33:00 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 20:33:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601170233.UAA25361@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.45 -> 1.46 --- Log message: SSE does not support i64 SINT_TO_FP (FP stack doesn't either, but we custom expand it), so ask legalizer to expand i32 UINT_TO_FP. --- Diffs of the changes: (+6 -1) X86ISelLowering.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.45 llvm/lib/Target/X86/X86ISelLowering.cpp:1.46 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.45 Mon Jan 16 18:37:42 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Mon Jan 16 20:32:49 2006 @@ -52,7 +52,12 @@ setOperationAction(ISD::UINT_TO_FP , MVT::i1 , Promote); setOperationAction(ISD::UINT_TO_FP , MVT::i8 , Promote); setOperationAction(ISD::UINT_TO_FP , MVT::i16 , Promote); - setOperationAction(ISD::UINT_TO_FP , MVT::i32 , Promote); + + if (X86ScalarSSE) + // No SSE i64 SINT_TO_FP, so expand i32 UINT_TO_FP instead. + setOperationAction(ISD::UINT_TO_FP , MVT::i32 , Expand); + else + setOperationAction(ISD::UINT_TO_FP , MVT::i32 , Promote); // Promote i1/i8 SINT_TO_FP to larger SINT_TO_FP's, as X86 doesn't have // this operation. From evan.cheng at apple.com Mon Jan 16 20:35:41 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Mon, 16 Jan 2006 20:35:41 -0600 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200601170235.UAA25382@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.183 -> 1.184 --- Log message: Turning on x86 DAG isel (llc-beta). --- Diffs of the changes: (+1 -1) Makefile.programs | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.183 llvm-test/Makefile.programs:1.184 --- llvm-test/Makefile.programs:1.183 Fri Jan 13 18:07:42 2006 +++ llvm-test/Makefile.programs Mon Jan 16 20:35:29 2006 @@ -197,7 +197,7 @@ LLCBETAOPTION := -enable-ia64-dag-isel endif ifeq ($(ARCH),x86) -LLCBETAOPTION := -enable-x86-fastcc +LLCBETAOPTION := -enable-x86-dag-isel endif # Given a version of the entire program linked together into a single unit of From duraid at octopus.com.au Mon Jan 16 21:10:00 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Mon, 16 Jan 2006 21:10:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Message-ID: <200601170310.VAA25584@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.24 -> 1.25 --- Log message: oops, this shouldn't have gotten in --- Diffs of the changes: (+0 -2) IA64ISelDAGToDAG.cpp | 2 -- 1 files changed, 2 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.24 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.25 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.24 Mon Jan 16 19:19:49 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Mon Jan 16 21:09:48 2006 @@ -228,8 +228,6 @@ TmpPR = TmpF5.getValue(1); Chain = TmpF5.getValue(2); - Chain = CurDAG->getCopyToReg(Chain, IA64::F8, TmpF5); - SDOperand minusB; if(isModulus) { // for remainders, it'll be handy to have // copies of -input_b From jeffc at jolt-lang.org Mon Jan 16 23:13:36 2006 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Mon, 16 Jan 2006 23:13:36 -0600 Subject: [llvm-commits] CVS: llvm/win32/Transforms/Transforms.vcproj Message-ID: <200601170513.XAA26152@zion.cs.uiuc.edu> Changes in directory llvm/win32/Transforms: Transforms.vcproj updated: 1.19 -> 1.20 --- Log message: Visual Studio still has issues with being left out. --- Diffs of the changes: (+0 -3) Transforms.vcproj | 3 --- 1 files changed, 3 deletions(-) Index: llvm/win32/Transforms/Transforms.vcproj diff -u llvm/win32/Transforms/Transforms.vcproj:1.19 llvm/win32/Transforms/Transforms.vcproj:1.20 --- llvm/win32/Transforms/Transforms.vcproj:1.19 Fri Dec 16 18:14:47 2005 +++ llvm/win32/Transforms/Transforms.vcproj Mon Jan 16 23:13:21 2006 @@ -279,9 +279,6 @@ RelativePath="..\..\lib\Transforms\Scalar\Mem2Reg.cpp"> - - Changes in directory llvm/win32/Support: Support.vcproj updated: 1.12 -> 1.13 --- Log message: Visual Studio still has issues with being left out. --- Diffs of the changes: (+3 -15) Support.vcproj | 18 +++--------------- 1 files changed, 3 insertions(+), 15 deletions(-) Index: llvm/win32/Support/Support.vcproj diff -u llvm/win32/Support/Support.vcproj:1.12 llvm/win32/Support/Support.vcproj:1.13 --- llvm/win32/Support/Support.vcproj:1.12 Fri Dec 16 18:14:47 2005 +++ llvm/win32/Support/Support.vcproj Mon Jan 16 23:13:21 2006 @@ -129,16 +129,6 @@ - - - - - - @@ -178,11 +168,6 @@ - - - + + From jeffc at jolt-lang.org Mon Jan 16 23:13:36 2006 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Mon, 16 Jan 2006 23:13:36 -0600 Subject: [llvm-commits] CVS: llvm/win32/VMCore/VMCore.vcproj Message-ID: <200601170513.XAA26158@zion.cs.uiuc.edu> Changes in directory llvm/win32/VMCore: VMCore.vcproj updated: 1.12 -> 1.13 --- Log message: Visual Studio still has issues with being left out. --- Diffs of the changes: (+6 -0) VMCore.vcproj | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/win32/VMCore/VMCore.vcproj diff -u llvm/win32/VMCore/VMCore.vcproj:1.12 llvm/win32/VMCore/VMCore.vcproj:1.13 --- llvm/win32/VMCore/VMCore.vcproj:1.12 Wed Jan 11 10:21:53 2006 +++ llvm/win32/VMCore/VMCore.vcproj Mon Jan 16 23:13:22 2006 @@ -112,6 +112,9 @@ RelativePath="..\..\lib\VMCore\AsmWriter.cpp"> + + + + Changes in directory llvm-gcc/gcc: llvm-expand.c updated: 1.125 -> 1.126 llvm-representation.h updated: 1.22 -> 1.23 llvm-types.c updated: 1.31 -> 1.32 --- Log message: Force bit count intrinsics to all have unsigned operands and unsigned results. --- Diffs of the changes: (+70 -45) llvm-expand.c | 101 ++++++++++++++++++++++++++++---------------------- llvm-representation.h | 3 - llvm-types.c | 11 +++++ 3 files changed, 70 insertions(+), 45 deletions(-) Index: llvm-gcc/gcc/llvm-expand.c diff -u llvm-gcc/gcc/llvm-expand.c:1.125 llvm-gcc/gcc/llvm-expand.c:1.126 --- llvm-gcc/gcc/llvm-expand.c:1.125 Mon Jan 16 16:21:14 2006 +++ llvm-gcc/gcc/llvm-expand.c Tue Jan 17 00:22:23 2006 @@ -3394,7 +3394,7 @@ /* Add a PHI node to merge together the two computed values */ - if (CondBr->NumOperands == 1 && CondBr->Operands[0] != DoneBlock) { + if (CondBr->NumOperands == 1 && CondBr->Operands[0] != D2V(DoneBlock)) { /* The cond branch terminating FromBlock was folded to not go to the done * block at all. This code is only reachable from the TestBlock. */ @@ -4585,19 +4585,23 @@ return BL->Fn = CreateIntrinsicFnWithType(Name, FnTy); } -static llvm_value * -llvm_expand_builtin_unaryop(llvm_function *Fn, llvm_type *DestTy, - tree arglist, const char *FnName) { - llvm_value *arg; - llvm_instruction *TheCall; +/* llvm_expand_unaryop - Expand the specified operand list to a unary function, + * checking that it is actually a list with one element. + */ +static llvm_value *llvm_expand_unaryop(llvm_function *Fn, tree arglist) { if (arglist == 0 || TREE_CHAIN(arglist) != 0) { - error("Invalid argument list to `%s'", FnName); - return llvm_constant_get_null(DestTy); + error("Invalid argument list to function"); + exit(1); } - - arg = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); - TheCall = llvm_instruction_new(arg->Ty, "tmp", O_Call, 2); + return llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); +} + +static llvm_value * +llvm_expand_builtin_unaryop(llvm_function *Fn, llvm_type *DestTy, + llvm_value *arg, const char *FnName) { + llvm_instruction *TheCall = + llvm_instruction_new(arg->Ty, "tmp", O_Call, 2); TheCall->Operands[0] = G2V(GetUnaryBuiltin(FnName, arg->Ty)); TheCall->Operands[1] = arg; append_inst(Fn, TheCall); @@ -4759,12 +4763,12 @@ case BUILT_IN_SQRTL: /* If errno math has been disabled, expand these to llvm.sqrt calls. */ if (!flag_errno_math) { - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); switch (Op0->Ty->ID) { case FloatTyID: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist,"llvm.sqrt.f32"); + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.sqrt.f32"); case DoubleTyID: - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist,"llvm.sqrt.f64"); + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.sqrt.f64"); default: abort(); /* shouldn't happen */ } @@ -4949,50 +4953,59 @@ case BUILT_IN_CLZ: case BUILT_IN_CLZL: case BUILT_IN_CLZLL: - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); + if (llvm_type_is_signed(Op0->Ty)) + Op0 = cast_if_type_not_equal(Fn, Op0, + llvm_type_get_unsigned_version(Op0->Ty)); switch (Op0->Ty->ID) { - case UByteTyID: case SByteTyID: /* 8 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i8"); - case UShortTyID: case ShortTyID: /* 16 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i16"); - case UIntTyID: case IntTyID: /* 32 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i32"); - case ULongTyID: case LongTyID: /* 64 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctlz.i64"); + case UByteTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i8"); + case UShortTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i16"); + case UIntTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i32"); + case ULongTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctlz.i64"); default: - abort(); /* this shouldn't happen? */ + abort(); /* this shouldn't happen */ } case BUILT_IN_CTZ: case BUILT_IN_CTZL: case BUILT_IN_CTZLL: - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); + if (llvm_type_is_signed(Op0->Ty)) + Op0 = cast_if_type_not_equal(Fn, Op0, + llvm_type_get_unsigned_version(Op0->Ty)); switch (Op0->Ty->ID) { - case UByteTyID: case SByteTyID: /* 8 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i8"); - case UShortTyID: case ShortTyID: /* 16 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i16"); - case UIntTyID: case IntTyID: /* 32 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i32"); - case ULongTyID: case LongTyID: /* 64 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.cttz.i64"); + case UByteTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i8"); + case UShortTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i16"); + case UIntTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i32"); + case ULongTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.cttz.i64"); default: - abort(); /* this shouldn't happen? */ + abort(); /* this shouldn't happen */ } case BUILT_IN_POPCOUNT: case BUILT_IN_POPCOUNTL: case BUILT_IN_POPCOUNTLL: - Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0); + Op0 = llvm_expand_unaryop(Fn, arglist); + if (llvm_type_is_signed(Op0->Ty)) + Op0 = cast_if_type_not_equal(Fn, Op0, + llvm_type_get_unsigned_version(Op0->Ty)); switch (Op0->Ty->ID) { - case UByteTyID: case SByteTyID: /* 8 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i8"); - case UShortTyID: case ShortTyID: /* 16 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i16"); - case UIntTyID: case IntTyID: /* 32 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i32"); - case ULongTyID: case LongTyID: /* 64 bit types... */ - return llvm_expand_builtin_unaryop(Fn, DestTy, arglist, "llvm.ctpop.i64"); + case UByteTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i8"); + case UShortTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i16"); + case UIntTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i32"); + case ULongTyID: + return llvm_expand_builtin_unaryop(Fn, DestTy, Op0, "llvm.ctpop.i64"); default: - abort(); /* this shouldn't happen? */ + abort(); /* this shouldn't happen */ } #if 0 Index: llvm-gcc/gcc/llvm-representation.h diff -u llvm-gcc/gcc/llvm-representation.h:1.22 llvm-gcc/gcc/llvm-representation.h:1.23 --- llvm-gcc/gcc/llvm-representation.h:1.22 Fri Dec 16 16:17:33 2005 +++ llvm-gcc/gcc/llvm-representation.h Tue Jan 17 00:22:23 2006 @@ -472,7 +472,8 @@ * promoted type. */ llvm_type *llvm_type_get_promoted_type(llvm_type *Ty); - +llvm_type *llvm_type_get_unsigned_version(llvm_type *Ty); + /* Creation methods for types */ llvm_type *llvm_type_get_array(llvm_type *Ty, unsigned NumElements); llvm_type *llvm_type_get_pointer(llvm_type *Ty); Index: llvm-gcc/gcc/llvm-types.c diff -u llvm-gcc/gcc/llvm-types.c:1.31 llvm-gcc/gcc/llvm-types.c:1.32 --- llvm-gcc/gcc/llvm-types.c:1.31 Fri Nov 4 00:18:30 2005 +++ llvm-gcc/gcc/llvm-types.c Tue Jan 17 00:22:23 2006 @@ -554,6 +554,17 @@ } } +llvm_type *llvm_type_get_unsigned_version(llvm_type *Ty) { + assert(llvm_type_is_signed(Ty)); + switch (Ty->ID) { + default: abort(); + case SByteTyID: return UByteTy; + case ShortTyID: return UShortTy; + case IntTyID: return UIntTy; + case LongTyID: return ULongTy; + } +} + /* This function prints the type list in reverse order. If this causes a problem due to stack depth at some point, we should change construction of From lattner at cs.uiuc.edu Tue Jan 17 00:24:13 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 17 Jan 2006 00:24:13 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2006-01-16-BitCountIntrinsicsUnsigned.c Message-ID: <200601170624.AAA26547@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2006-01-16-BitCountIntrinsicsUnsigned.c added (r1.1) --- Log message: Ensure that the CFE always emits intrinsics in their unsigned version, not with signed operands --- Diffs of the changes: (+9 -0) 2006-01-16-BitCountIntrinsicsUnsigned.c | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/test/Regression/CFrontend/2006-01-16-BitCountIntrinsicsUnsigned.c diff -c /dev/null llvm/test/Regression/CFrontend/2006-01-16-BitCountIntrinsicsUnsigned.c:1.1 *** /dev/null Tue Jan 17 00:24:11 2006 --- llvm/test/Regression/CFrontend/2006-01-16-BitCountIntrinsicsUnsigned.c Tue Jan 17 00:24:01 2006 *************** *** 0 **** --- 1,9 ---- + // RUN: %llvmgcc -S %s -o - | grep 'llvm.ctlz.i32(uint' && + // RUN: %llvmgcc -S %s -o - | not grep 'llvm.ctlz.i32(int' + + unsigned t2(unsigned X) { + return __builtin_clz(X); + } + int t1(int X) { + return __builtin_clz(X); + } From evan.cheng at apple.com Tue Jan 17 01:02:58 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 17 Jan 2006 01:02:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200601170702.BAA26682@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.210 -> 1.211 --- Log message: Zero extending load from i1 to i8. --- Diffs of the changes: (+2 -0) X86InstrInfo.td | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.210 llvm/lib/Target/X86/X86InstrInfo.td:1.211 --- llvm/lib/Target/X86/X86InstrInfo.td:1.210 Mon Jan 16 18:19:47 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Jan 17 01:02:46 2006 @@ -343,6 +343,7 @@ def sextloadi32i8 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i8))>; def sextloadi32i16 : PatFrag<(ops node:$ptr), (i32 (sextload node:$ptr, i16))>; +def zextloadi8i1 : PatFrag<(ops node:$ptr), (i8 (zextload node:$ptr, i1))>; 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))>; @@ -3029,6 +3030,7 @@ // {s|z}extload bool -> {s|z}extload byte def : Pat<(sextloadi16i1 addr:$src), (MOVSX16rm8 addr:$src)>; def : Pat<(sextloadi32i1 addr:$src), (MOVSX32rm8 addr:$src)>; +def : Pat<(zextloadi8i1 addr:$src), (MOV8rm addr:$src)>; def : Pat<(zextloadi16i1 addr:$src), (MOVZX16rm8 addr:$src)>; def : Pat<(zextloadi32i1 addr:$src), (MOVZX32rm8 addr:$src)>; From evan.cheng at apple.com Tue Jan 17 01:36:53 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 17 Jan 2006 01:36:53 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200601170736.BAA26770@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.134 -> 1.135 --- Log message: Emit a type matching check for ComplexPatterns. --- Diffs of the changes: (+2 -0) DAGISelEmitter.cpp | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.134 llvm/utils/TableGen/DAGISelEmitter.cpp:1.135 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.134 Sun Jan 15 04:04:45 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Tue Jan 17 01:36:41 2006 @@ -556,6 +556,8 @@ // Using a VTSDNode or CondCodeSDNode. return Other; } else if (R->isSubClassOf("ComplexPattern")) { + if (NotRegisters) + return Unknown; std::vector ComplexPat(1, TP.getDAGISelEmitter().getComplexPattern(R).getValueType()); return ComplexPat; From jlaskey at apple.com Tue Jan 17 10:30:19 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 10:30:19 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200601171630.KAA05307@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h updated: 1.2 -> 1.3 --- Log message: Reduce memory consumption and force (somewhat) access to entries via ID. --- Diffs of the changes: (+11 -11) UniqueVector.h | 22 +++++++++++----------- 1 files changed, 11 insertions(+), 11 deletions(-) Index: llvm/include/llvm/ADT/UniqueVector.h diff -u llvm/include/llvm/ADT/UniqueVector.h:1.2 llvm/include/llvm/ADT/UniqueVector.h:1.3 --- llvm/include/llvm/ADT/UniqueVector.h:1.2 Mon Jan 16 17:44:03 2006 +++ llvm/include/llvm/ADT/UniqueVector.h Tue Jan 17 10:29:58 2006 @@ -18,17 +18,17 @@ //===----------------------------------------------------------------------===// /// UniqueVector - This class produces a sequential ID number (base 1) for each -/// unique entry that is added. This class also provides an ID ordered vector -/// of the entries (indexed by ID - 1.) T is the type of entries in the vector. -/// This class should have an implementation of operator== and of operator<. +/// unique entry that is added. T is the type of entries in the vector. This +/// class should have an implementation of operator== and of operator<. +/// Entries can be fetched using operator[] with the entry ID. template class UniqueVector { private: // Map - Used to handle the correspondence of entry to ID. - typename std::map Map; + std::map Map; // Vector - ID ordered vector of entries. Entries can be indexed by ID - 1. // - typename std::vector Vector; + std::vector Vector; public: /// insert - Append entry to the vector if it doesn't already exist. Returns @@ -44,25 +44,25 @@ unsigned ID = Vector.size() + 1; // Insert in map. - Map.insert(MI, std::make_pair(Entry, ID)); + MI = Map.insert(MI, std::make_pair(Entry, ID)); // Insert in vector. - Vector.push_back(Entry); + Vector.push_back(&MI->first); return ID; } /// operator[] - Returns a reference to the entry with the specified ID. - /// - const T &operator[](unsigned ID) const { return Vector[ID - 1]; } + /// + const T &operator[](unsigned ID) const { return *Vector[ID - 1]; } /// size - Returns the number of entries in the vector. /// size_t size() const { return Vector.size(); } - /// getVector - Return the ID ordered vector of entries. + /// empty - Returns true if the vector is empty. /// - const typename std::vector &getVector() const { return Vector; } + bool empty() const { return Vector.empty(); } }; } // End of namespace llvm From criswell at cs.uiuc.edu Tue Jan 17 11:01:57 2006 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue, 17 Jan 2006 11:01:57 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/FileLexer.cpp FileParser.cpp FileParser.h Message-ID: <200601171701.LAA11633@choi.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: FileLexer.cpp updated: 1.3 -> 1.4 FileParser.cpp updated: 1.10 -> 1.11 FileParser.h updated: 1.4 -> 1.5 --- Log message: Regenerated the Lex and Yacc output files on Linux. It seems that our Linux machines don't like the source code generated on MacOS X for some reason. --- Diffs of the changes: (+1652 -1195) FileLexer.cpp | 74 - FileParser.cpp | 2655 ++++++++++++++++++++++++++++++++------------------------- FileParser.h | 111 +- 3 files changed, 1652 insertions(+), 1188 deletions(-) Index: llvm/utils/TableGen/FileLexer.cpp diff -u llvm/utils/TableGen/FileLexer.cpp:1.3 llvm/utils/TableGen/FileLexer.cpp:1.4 --- llvm/utils/TableGen/FileLexer.cpp:1.3 Mon Sep 12 00:30:06 2005 +++ llvm/utils/TableGen/FileLexer.cpp Tue Jan 17 11:01:34 2006 @@ -21,7 +21,7 @@ /* A lexical scanner generated by flex */ /* Scanner skeleton version: - * $Header: /home/vadve/shared/PublicCVS/llvm/utils/TableGen/FileLexer.cpp,v 1.3 2005/09/12 05:30:06 lattner Exp $ + * $Header: /home/vadve/shared/PublicCVS/llvm/utils/TableGen/FileLexer.cpp,v 1.4 2006/01/17 17:01:34 criswell Exp $ */ #define FLEX_SCANNER @@ -489,7 +489,7 @@ #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET char *yytext; -#line 1 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 1 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" #define INITIAL 0 /*===-- FileLexer.l - Scanner for TableGen Files ----------------*- C++ -*-===// // @@ -507,7 +507,7 @@ #define YY_NEVER_INTERACTIVE 1 #define comment 1 -#line 30 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 30 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" #include "Record.h" typedef std::pair*> SubClassRefTy; #include "FileParser.h" @@ -795,7 +795,7 @@ register char *yy_cp = NULL, *yy_bp = NULL; register int yy_act; -#line 176 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 176 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" #line 802 "Lexer.cpp" @@ -891,165 +891,165 @@ { /* beginning of action switch */ case 1: YY_RULE_SETUP -#line 178 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 178 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { /* Ignore comments */ } YY_BREAK case 2: YY_RULE_SETUP -#line 180 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 180 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { HandleInclude(yytext); } YY_BREAK case 3: YY_RULE_SETUP -#line 181 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 181 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext+2, yytext+yyleng-2); return CODEFRAGMENT; } YY_BREAK case 4: YY_RULE_SETUP -#line 184 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 184 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return INT; } YY_BREAK case 5: YY_RULE_SETUP -#line 185 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 185 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return BIT; } YY_BREAK case 6: YY_RULE_SETUP -#line 186 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 186 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return BITS; } YY_BREAK case 7: YY_RULE_SETUP -#line 187 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 187 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return STRING; } YY_BREAK case 8: YY_RULE_SETUP -#line 188 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 188 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return LIST; } YY_BREAK case 9: YY_RULE_SETUP -#line 189 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 189 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return CODE; } YY_BREAK case 10: YY_RULE_SETUP -#line 190 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 190 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return DAG; } YY_BREAK case 11: YY_RULE_SETUP -#line 192 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 192 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return CLASS; } YY_BREAK case 12: YY_RULE_SETUP -#line 193 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 193 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return DEF; } YY_BREAK case 13: YY_RULE_SETUP -#line 194 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 194 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return FIELD; } YY_BREAK case 14: YY_RULE_SETUP -#line 195 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 195 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return LET; } YY_BREAK case 15: YY_RULE_SETUP -#line 196 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 196 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return IN; } YY_BREAK case 16: YY_RULE_SETUP -#line 198 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 198 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return SRATOK; } YY_BREAK case 17: YY_RULE_SETUP -#line 199 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 199 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return SRLTOK; } YY_BREAK case 18: YY_RULE_SETUP -#line 200 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 200 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return SHLTOK; } YY_BREAK case 19: YY_RULE_SETUP -#line 203 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 203 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext, yytext+yyleng); return ID; } YY_BREAK case 20: YY_RULE_SETUP -#line 205 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 205 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng); return VARNAME; } YY_BREAK case 21: YY_RULE_SETUP -#line 208 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 208 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { Filelval.StrVal = new std::string(yytext+1, yytext+yyleng-1); return STRVAL; } YY_BREAK case 22: YY_RULE_SETUP -#line 211 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 211 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { Filelval.IntVal = ParseInt(Filetext); return INTVAL; } YY_BREAK case 23: YY_RULE_SETUP -#line 213 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 213 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { /* Ignore whitespace */ } YY_BREAK case 24: YY_RULE_SETUP -#line 216 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 216 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { BEGIN(comment); CommentDepth++; } YY_BREAK case 25: YY_RULE_SETUP -#line 217 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 217 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" {} /* eat anything that's not a '*' or '/' */ YY_BREAK case 26: YY_RULE_SETUP -#line 218 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 218 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" {} /* eat up '*'s not followed by '/'s */ YY_BREAK case 27: YY_RULE_SETUP -#line 219 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 219 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { ++CommentDepth; } YY_BREAK case 28: YY_RULE_SETUP -#line 220 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 220 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" {} /* eat up /'s not followed by *'s */ YY_BREAK case 29: YY_RULE_SETUP -#line 221 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 221 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { if (!--CommentDepth) { BEGIN(INITIAL); } } YY_BREAK case YY_STATE_EOF(comment): -#line 222 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 222 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { err() << "Unterminated comment!\n"; exit(1); } YY_BREAK case 30: YY_RULE_SETUP -#line 224 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 224 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" { return Filetext[0]; } YY_BREAK case 31: YY_RULE_SETUP -#line 226 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 226 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK #line 1056 "Lexer.cpp" @@ -1932,5 +1932,5 @@ return 0; } #endif -#line 226 "/home/vadve/lattner/llvm/utils/TableGen/FileLexer.l" +#line 226 "/home/vadve/criswell/llvm/utils/TableGen/FileLexer.l" Index: llvm/utils/TableGen/FileParser.cpp diff -u llvm/utils/TableGen/FileParser.cpp:1.10 llvm/utils/TableGen/FileParser.cpp:1.11 --- llvm/utils/TableGen/FileParser.cpp:1.10 Tue Jan 10 13:05:34 2006 +++ llvm/utils/TableGen/FileParser.cpp Tue Jan 17 11:01:34 2006 @@ -1,38 +1,115 @@ +/* A Bison parser, made by GNU Bison 1.875. */ -/* A Bison parser, made from /Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ #define yyparse Fileparse -#define yylex Filelex +#define yylex Filelex #define yyerror Fileerror -#define yylval Filelval -#define yychar Filechar +#define yylval Filelval +#define yychar Filechar #define yydebug Filedebug #define yynerrs Filenerrs -#define INT 257 -#define BIT 258 -#define STRING 259 -#define BITS 260 -#define LIST 261 -#define CODE 262 -#define DAG 263 -#define CLASS 264 -#define DEF 265 -#define FIELD 266 -#define LET 267 -#define IN 268 -#define SHLTOK 269 -#define SRATOK 270 -#define SRLTOK 271 -#define INTVAL 272 -#define ID 273 -#define VARNAME 274 -#define STRVAL 275 -#define CODEFRAGMENT 276 -#line 14 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + INT = 258, + BIT = 259, + STRING = 260, + BITS = 261, + LIST = 262, + CODE = 263, + DAG = 264, + CLASS = 265, + DEF = 266, + FIELD = 267, + LET = 268, + IN = 269, + SHLTOK = 270, + SRATOK = 271, + SRLTOK = 272, + INTVAL = 273, + ID = 274, + VARNAME = 275, + STRVAL = 276, + CODEFRAGMENT = 277 + }; +#endif +#define INT 258 +#define BIT 259 +#define STRING 260 +#define BITS 261 +#define LIST 262 +#define CODE 263 +#define DAG 264 +#define CLASS 265 +#define DEF 266 +#define FIELD 267 +#define LET 268 +#define IN 269 +#define SHLTOK 270 +#define SRATOK 271 +#define SRLTOK 272 +#define INTVAL 273 +#define ID 274 +#define VARNAME 275 +#define STRVAL 276 +#define CODEFRAGMENT 277 + + + + +/* Copy the first part of user declarations. */ +#line 14 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" #include "Record.h" #include "llvm/ADT/StringExtras.h" @@ -207,8 +284,23 @@ using namespace llvm; -#line 189 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -typedef union { + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 189 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" +typedef union YYSTYPE { std::string* StrVal; int IntVal; llvm::RecTy* Ty; @@ -220,541 +312,835 @@ std::vector* SubClassList; std::vector >* DagValueList; } YYSTYPE; -#include +/* Line 191 of yacc.c. */ +#line 316 "FileParser.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 328 "FileParser.tab.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# else +# ifndef YYSTACK_USE_ALLOCA +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC malloc +# define YYSTACK_FREE free +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif #endif +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; +#endif - -#define YYFINAL 160 -#define YYFLAG -32768 -#define YYNTBASE 38 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 276 ? yytranslate[x] : 78) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 32, - 33, 2, 2, 34, 36, 31, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 35, 37, 23, - 25, 24, 26, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 29, 2, 30, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 27, 2, 28, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 20 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 163 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 38 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 41 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 89 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 160 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 277 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 32, 33, 2, 2, 34, 36, 31, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 35, 37, + 23, 25, 24, 26, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 29, 2, 30, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 27, 2, 28, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22 }; -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 11, 13, 18, 20, 22, 24, - 25, 27, 28, 31, 33, 35, 37, 39, 43, 48, - 50, 55, 59, 63, 68, 73, 80, 87, 94, 95, - 98, 101, 106, 107, 109, 111, 115, 118, 122, 128, - 133, 135, 136, 140, 141, 143, 145, 149, 154, 157, - 164, 165, 168, 170, 174, 176, 181, 183, 187, 188, - 191, 193, 197, 201, 202, 204, 206, 207, 209, 211, - 213, 214, 218, 219, 220, 227, 231, 233, 235, 240, - 242, 246, 247, 252, 257, 260, 262, 265 +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 9, 14, 16, 21, 23, + 25, 27, 28, 30, 31, 34, 36, 38, 40, 42, + 46, 51, 53, 58, 62, 66, 71, 76, 83, 90, + 97, 98, 101, 104, 109, 110, 112, 114, 118, 121, + 125, 131, 136, 138, 139, 143, 144, 146, 148, 152, + 157, 160, 167, 168, 171, 173, 177, 179, 184, 186, + 190, 191, 194, 196, 200, 204, 205, 207, 209, 210, + 212, 214, 216, 217, 221, 222, 223, 230, 234, 236, + 238, 243, 245, 249, 250, 255, 260, 263, 265, 268 }; -static const short yyrhs[] = { 19, - 0, 5, 0, 4, 0, 6, 23, 18, 24, 0, - 3, 0, 7, 23, 39, 24, 0, 8, 0, 9, - 0, 38, 0, 0, 12, 0, 0, 25, 42, 0, - 18, 0, 21, 0, 22, 0, 26, 0, 27, 49, - 28, 0, 19, 23, 50, 24, 0, 19, 0, 42, - 27, 47, 28, 0, 29, 49, 30, 0, 42, 31, - 19, 0, 32, 19, 45, 33, 0, 42, 29, 47, - 30, 0, 15, 32, 42, 34, 42, 33, 0, 16, - 32, 42, 34, 42, 33, 0, 17, 32, 42, 34, - 42, 33, 0, 0, 35, 20, 0, 42, 43, 0, - 44, 34, 42, 43, 0, 0, 44, 0, 18, 0, - 18, 36, 18, 0, 18, 18, 0, 46, 34, 18, - 0, 46, 34, 18, 36, 18, 0, 46, 34, 18, - 18, 0, 46, 0, 0, 27, 47, 28, 0, 0, - 50, 0, 42, 0, 50, 34, 42, 0, 40, 39, - 19, 41, 0, 51, 37, 0, 13, 19, 48, 25, - 42, 37, 0, 0, 53, 52, 0, 37, 0, 27, - 53, 28, 0, 38, 0, 38, 23, 50, 24, 0, - 55, 0, 56, 34, 55, 0, 0, 35, 56, 0, - 51, 0, 58, 34, 51, 0, 23, 58, 24, 0, - 0, 59, 0, 19, 0, 0, 61, 0, 62, 0, - 62, 0, 0, 57, 66, 54, 0, 0, 0, 10, - 63, 68, 60, 69, 65, 0, 11, 64, 65, 0, - 67, 0, 70, 0, 19, 48, 25, 42, 0, 72, - 0, 73, 34, 72, 0, 0, 13, 75, 73, 14, - 0, 74, 27, 76, 28, 0, 74, 71, 0, 71, - 0, 76, 71, 0, 76, 0 +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 78, 0, -1, 19, -1, 5, -1, 4, -1, 6, + 23, 18, 24, -1, 3, -1, 7, 23, 40, 24, + -1, 8, -1, 9, -1, 39, -1, -1, 12, -1, + -1, 25, 43, -1, 18, -1, 21, -1, 22, -1, + 26, -1, 27, 50, 28, -1, 19, 23, 51, 24, + -1, 19, -1, 43, 27, 48, 28, -1, 29, 50, + 30, -1, 43, 31, 19, -1, 32, 19, 46, 33, + -1, 43, 29, 48, 30, -1, 15, 32, 43, 34, + 43, 33, -1, 16, 32, 43, 34, 43, 33, -1, + 17, 32, 43, 34, 43, 33, -1, -1, 35, 20, + -1, 43, 44, -1, 45, 34, 43, 44, -1, -1, + 45, -1, 18, -1, 18, 36, 18, -1, 18, 18, + -1, 47, 34, 18, -1, 47, 34, 18, 36, 18, + -1, 47, 34, 18, 18, -1, 47, -1, -1, 27, + 48, 28, -1, -1, 51, -1, 43, -1, 51, 34, + 43, -1, 41, 40, 19, 42, -1, 52, 37, -1, + 13, 19, 49, 25, 43, 37, -1, -1, 54, 53, + -1, 37, -1, 27, 54, 28, -1, 39, -1, 39, + 23, 51, 24, -1, 56, -1, 57, 34, 56, -1, + -1, 35, 57, -1, 52, -1, 59, 34, 52, -1, + 23, 59, 24, -1, -1, 60, -1, 19, -1, -1, + 62, -1, 63, -1, 63, -1, -1, 58, 67, 55, + -1, -1, -1, 10, 64, 69, 61, 70, 66, -1, + 11, 65, 66, -1, 68, -1, 71, -1, 19, 49, + 25, 43, -1, 73, -1, 74, 34, 73, -1, -1, + 13, 76, 74, 14, -1, 75, 27, 77, 28, -1, + 75, 72, -1, 72, -1, 77, 72, -1, 77, -1 }; -#endif - -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 223, 234, 236, 238, 240, 242, 244, 246, 248, 252, - 252, 254, 254, 256, 258, 261, 264, 266, 279, 307, - 322, 329, 332, 339, 347, 355, 361, 367, 375, 378, - 382, 387, 393, 396, 399, 402, 415, 429, 431, 444, - 460, 462, 462, 466, 468, 472, 475, 479, 489, 491, - 497, 497, 498, 498, 500, 502, 506, 511, 516, 519, - 523, 526, 531, 532, 532, 534, 534, 536, 543, 561, - 573, 587, 592, 594, 596, 600, 609, 609, 611, 616, - 616, 619, 619, 622, 625, 629, 629, 631 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 223, 223, 234, 236, 238, 240, 242, 244, 246, + 248, 252, 252, 254, 254, 256, 258, 261, 264, 266, + 279, 307, 322, 329, 332, 339, 347, 355, 361, 367, + 375, 378, 382, 387, 393, 396, 399, 402, 415, 429, + 431, 444, 460, 462, 462, 466, 468, 472, 475, 479, + 489, 491, 497, 497, 498, 498, 500, 502, 506, 511, + 516, 519, 523, 526, 531, 532, 532, 534, 534, 536, + 543, 561, 573, 573, 592, 594, 592, 600, 609, 609, + 611, 616, 616, 619, 619, 622, 625, 629, 629, 631 }; #endif - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","INT","BIT", -"STRING","BITS","LIST","CODE","DAG","CLASS","DEF","FIELD","LET","IN","SHLTOK", -"SRATOK","SRLTOK","INTVAL","ID","VARNAME","STRVAL","CODEFRAGMENT","'<'","'>'", -"'='","'?'","'{'","'}'","'['","']'","'.'","'('","')'","','","':'","'-'","';'", -"ClassID","Type","OptPrefix","OptValue","Value","OptVarName","DagArgListNE", -"DagArgList","RBitList","BitList","OptBitList","ValueList","ValueListNE","Declaration", -"BodyItem","BodyList","Body","SubClassRef","ClassListNE","ClassList","DeclListNE", -"TemplateArgList","OptTemplateArgList","OptID","ObjectName","ClassName","DefName", -"ObjectBody","@1","ClassInst","@2","@3","DefInst","Object","LETItem","LETList", -"LETCommand","@4","ObjectList","File", NULL +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "INT", "BIT", "STRING", "BITS", "LIST", + "CODE", "DAG", "CLASS", "DEF", "FIELD", "LET", "IN", "SHLTOK", "SRATOK", + "SRLTOK", "INTVAL", "ID", "VARNAME", "STRVAL", "CODEFRAGMENT", "'<'", + "'>'", "'='", "'?'", "'{'", "'}'", "'['", "']'", "'.'", "'('", "')'", + "','", "':'", "'-'", "';'", "$accept", "ClassID", "Type", "OptPrefix", + "OptValue", "Value", "OptVarName", "DagArgListNE", "DagArgList", + "RBitList", "BitList", "OptBitList", "ValueList", "ValueListNE", + "Declaration", "BodyItem", "BodyList", "Body", "SubClassRef", + "ClassListNE", "ClassList", "DeclListNE", "TemplateArgList", + "OptTemplateArgList", "OptID", "ObjectName", "ClassName", "DefName", + "ObjectBody", "@1", "ClassInst", "@2", "@3", "DefInst", "Object", + "LETItem", "LETList", "LETCommand", "@4", "ObjectList", "File", 0 }; #endif -static const short yyr1[] = { 0, - 38, 39, 39, 39, 39, 39, 39, 39, 39, 40, - 40, 41, 41, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, - 44, 44, 45, 45, 46, 46, 46, 46, 46, 46, - 47, 48, 48, 49, 49, 50, 50, 51, 52, 52, - 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, - 58, 58, 59, 60, 60, 61, 61, 62, 63, 64, - 66, 65, 68, 69, 67, 70, 71, 71, 72, 73, - 73, 75, 74, 71, 71, 76, 76, 77 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 60, 62, 61, 63, 123, 125, 91, + 93, 46, 40, 41, 44, 58, 45, 59 }; +# endif -static const short yyr2[] = { 0, - 1, 1, 1, 4, 1, 4, 1, 1, 1, 0, - 1, 0, 2, 1, 1, 1, 1, 3, 4, 1, - 4, 3, 3, 4, 4, 6, 6, 6, 0, 2, - 2, 4, 0, 1, 1, 3, 2, 3, 5, 4, - 1, 0, 3, 0, 1, 1, 3, 4, 2, 6, - 0, 2, 1, 3, 1, 4, 1, 3, 0, 2, - 1, 3, 3, 0, 1, 1, 0, 1, 1, 1, - 0, 3, 0, 0, 6, 3, 1, 1, 4, 1, - 3, 0, 4, 4, 2, 1, 2, 1 +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 38, 39, 40, 40, 40, 40, 40, 40, 40, + 40, 41, 41, 42, 42, 43, 43, 43, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + 44, 44, 45, 45, 46, 46, 47, 47, 47, 47, + 47, 47, 48, 49, 49, 50, 50, 51, 51, 52, + 53, 53, 54, 54, 55, 55, 56, 56, 57, 57, + 58, 58, 59, 59, 60, 61, 61, 62, 62, 63, + 64, 65, 67, 66, 69, 70, 68, 71, 72, 72, + 73, 74, 74, 76, 75, 72, 72, 77, 77, 78 }; -static const short yydefact[] = { 0, - 67, 67, 82, 77, 78, 86, 0, 88, 66, 68, - 69, 73, 70, 59, 0, 0, 85, 87, 64, 0, - 71, 76, 42, 80, 0, 0, 10, 65, 74, 1, - 55, 57, 60, 0, 0, 0, 83, 0, 84, 11, - 0, 61, 0, 59, 0, 0, 51, 53, 72, 35, - 41, 0, 0, 81, 5, 3, 2, 0, 0, 7, - 8, 9, 0, 63, 10, 75, 0, 0, 0, 14, - 20, 15, 16, 17, 44, 44, 0, 46, 0, 58, - 10, 37, 0, 0, 43, 79, 0, 0, 12, 62, - 0, 0, 0, 0, 0, 45, 0, 33, 0, 0, - 0, 56, 0, 0, 54, 0, 52, 36, 38, 0, - 0, 0, 48, 0, 0, 0, 0, 18, 22, 29, - 34, 0, 0, 0, 23, 47, 42, 49, 40, 0, - 4, 6, 13, 0, 0, 0, 19, 0, 31, 0, - 24, 21, 25, 0, 39, 0, 0, 0, 30, 29, - 0, 26, 27, 28, 32, 0, 50, 0, 0, 0 +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 1, 4, 1, 4, 1, 1, + 1, 0, 1, 0, 2, 1, 1, 1, 1, 3, + 4, 1, 4, 3, 3, 4, 4, 6, 6, 6, + 0, 2, 2, 4, 0, 1, 1, 3, 2, 3, + 5, 4, 1, 0, 3, 0, 1, 1, 3, 4, + 2, 6, 0, 2, 1, 3, 1, 4, 1, 3, + 0, 2, 1, 3, 3, 0, 1, 1, 0, 1, + 1, 1, 0, 3, 0, 0, 6, 3, 1, 1, + 4, 1, 3, 0, 4, 4, 2, 1, 2, 1 }; -static const short yydefgoto[] = { 31, - 63, 41, 113, 78, 139, 121, 122, 51, 52, 36, - 95, 96, 42, 107, 81, 49, 32, 33, 21, 43, - 28, 29, 10, 11, 12, 14, 22, 34, 4, 19, - 44, 5, 6, 24, 25, 7, 15, 8, 158 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 0, 68, 68, 83, 78, 79, 87, 0, 89, 0, + 67, 69, 70, 74, 71, 60, 0, 0, 86, 88, + 1, 65, 0, 72, 77, 43, 81, 0, 0, 11, + 66, 75, 2, 56, 58, 61, 0, 0, 0, 84, + 0, 85, 12, 0, 62, 0, 60, 0, 0, 52, + 54, 73, 36, 42, 0, 0, 82, 6, 4, 3, + 0, 0, 8, 9, 10, 0, 64, 11, 76, 0, + 0, 0, 15, 21, 16, 17, 18, 45, 45, 0, + 47, 0, 59, 11, 38, 0, 0, 44, 80, 0, + 0, 13, 63, 0, 0, 0, 0, 0, 46, 0, + 34, 0, 0, 0, 57, 0, 0, 55, 0, 53, + 37, 39, 0, 0, 0, 49, 0, 0, 0, 0, + 19, 23, 30, 35, 0, 0, 0, 24, 48, 43, + 50, 41, 0, 5, 7, 14, 0, 0, 0, 20, + 0, 32, 0, 25, 22, 26, 0, 40, 0, 0, + 0, 31, 30, 0, 27, 28, 29, 33, 0, 51 }; -static const short yypact[] = { 56, - -4, -4,-32768,-32768,-32768,-32768, 1, 56,-32768,-32768, --32768,-32768,-32768, 8, 2, 56,-32768,-32768, 23, 30, --32768,-32768, 50,-32768, -11, -3, 66,-32768,-32768,-32768, - 62,-32768, 55, 34, 61, 68,-32768, 2,-32768,-32768, - 49,-32768, -8, 8, 15, 30,-32768,-32768,-32768, -14, - 82, 67, 15,-32768,-32768,-32768,-32768, 95, 97,-32768, --32768,-32768, 77,-32768, 66,-32768, 89, 90, 91,-32768, - 101,-32768,-32768,-32768, 15, 15, 106, 73, 39,-32768, - 7,-32768, 108, 109,-32768, 73, 110, 49, 104,-32768, - 15, 15, 15, 15, 102, 98, 103, 15, 61, 61, - 112,-32768, 15, 115,-32768, 99,-32768,-32768, -9, 111, - 113, 15,-32768, 57, 63, 72, 41,-32768,-32768, 45, - 105, 107, 114, 116,-32768, 73, 50,-32768,-32768, 120, --32768,-32768, 73, 15, 15, 15,-32768, 121,-32768, 15, --32768,-32768,-32768, 118,-32768, 78, 81, 86,-32768, 45, - 15,-32768,-32768,-32768,-32768, 33,-32768, 144, 145,-32768 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 33, 65, 43, 115, 80, 141, 123, 124, 53, + 54, 38, 97, 98, 44, 109, 83, 51, 34, 35, + 23, 45, 30, 31, 11, 12, 13, 15, 24, 36, + 4, 21, 46, 5, 6, 26, 27, 7, 16, 8, + 9 }; -static const short yypgoto[] = { -40, - 59,-32768,-32768, -53, -1,-32768,-32768,-32768, -82, 21, - 74, -43, -52,-32768,-32768,-32768, 117,-32768,-32768,-32768, --32768,-32768,-32768, 149,-32768,-32768, 122,-32768,-32768,-32768, --32768,-32768, -2, 119,-32768,-32768,-32768, 136,-32768 +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -82 +static const yysigned_char yypact[] = +{ + 114, -12, -12, -82, -82, -82, -82, 4, 114, 16, + -82, -82, -82, -82, -82, -3, 10, 114, -82, -82, + -82, 12, 17, -82, -82, 14, -82, -9, -2, 35, + -82, -82, -82, 26, -82, 28, -14, 46, 42, -82, + 10, -82, -82, 69, -82, 3, -3, 39, 17, -82, + -82, -82, -8, 36, 41, 39, -82, -82, -82, -82, + 56, 57, -82, -82, -82, 66, -82, 35, -82, 52, + 54, 58, -82, 72, -82, -82, -82, 39, 39, 87, + 91, 9, -82, 6, -82, 108, 110, -82, 91, 111, + 69, 105, -82, 39, 39, 39, 39, 103, 98, 104, + 39, 46, 46, 116, -82, 39, 117, -82, 96, -82, + -82, -6, 113, 115, 39, -82, 65, 73, 74, 29, + -82, -82, 62, 106, 109, 118, 119, -82, 91, 14, + -82, -82, 120, -82, -82, 91, 39, 39, 39, -82, + 121, -82, 39, -82, -82, -82, 122, -82, 82, 83, + 90, -82, 62, 39, -82, -82, -82, -82, 15, -82 }; - -#define YYLAST 166 - - -static const short yytable[] = { 86, - 62, 79, 37, 82, 17, 18, 1, 2, 129, 3, - 1, 2, 90, 3, 9, 64, 123, 124, 40, 104, - 23, 83, 38, 18, 39, 65, 130, 16, 106, 67, - 68, 69, 70, 71, 105, 72, 73, 114, 115, 116, - 74, 75, 20, 76, 120, 27, 77, 62, 30, 126, - 117, 55, 56, 57, 58, 59, 60, 61, 133, 99, - 47, 100, 102, 101, 137, 1, 2, 30, 3, 157, - 48, 99, 103, 100, 103, 101, 35, 40, 50, 138, - 146, 147, 148, 99, 45, 100, 150, 101, 46, 99, - 134, 100, 53, 101, 85, 89, 135, 156, 99, 99, - 100, 100, 101, 101, 99, 136, 100, 99, 101, 100, - 152, 101, 99, 153, 100, 84, 101, 87, 154, 88, - 91, 92, 93, 94, 98, 108, 109, 110, 112, 118, - 125, 103, 119, 127, 131, 128, 132, 145, 140, 141, - 149, 142, 151, 159, 160, 143, 111, 144, 155, 97, - 13, 26, 0, 0, 0, 0, 54, 0, 0, 0, - 0, 0, 80, 0, 0, 66 +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -82, -42, 53, -82, -82, -55, -7, -82, -82, -82, + -81, 19, 75, -45, -61, -82, -82, -82, 102, -82, + -82, -82, -82, -82, -82, 142, -82, -82, 112, -82, + -82, -82, -82, -82, -4, 123, -82, -82, -82, 134, + -82 }; -static const short yycheck[] = { 53, - 41, 45, 14, 18, 7, 8, 10, 11, 18, 13, - 10, 11, 65, 13, 19, 24, 99, 100, 12, 13, - 19, 36, 34, 26, 28, 34, 36, 27, 81, 15, - 16, 17, 18, 19, 28, 21, 22, 91, 92, 93, - 26, 27, 35, 29, 98, 23, 32, 88, 19, 103, - 94, 3, 4, 5, 6, 7, 8, 9, 112, 27, - 27, 29, 24, 31, 24, 10, 11, 19, 13, 37, - 37, 27, 34, 29, 34, 31, 27, 12, 18, 35, - 134, 135, 136, 27, 23, 29, 140, 31, 34, 27, - 34, 29, 25, 31, 28, 19, 34, 151, 27, 27, - 29, 29, 31, 31, 27, 34, 29, 27, 31, 29, - 33, 31, 27, 33, 29, 34, 31, 23, 33, 23, - 32, 32, 32, 23, 19, 18, 18, 18, 25, 28, - 19, 34, 30, 19, 24, 37, 24, 18, 34, 33, - 20, 28, 25, 0, 0, 30, 88, 127, 150, 76, - 2, 16, -1, -1, -1, -1, 38, -1, -1, -1, - -1, -1, 46, -1, -1, 44 +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -1 +static const unsigned char yytable[] = +{ + 88, 64, 81, 18, 19, 39, 92, 10, 1, 2, + 84, 3, 131, 49, 1, 2, 20, 3, 42, 106, + 125, 126, 108, 50, 19, 40, 41, 66, 85, 25, + 132, 17, 22, 104, 107, 29, 32, 67, 116, 117, + 118, 37, 101, 105, 102, 122, 103, 42, 64, 47, + 128, 119, 159, 139, 69, 70, 71, 72, 73, 135, + 74, 75, 48, 105, 52, 76, 77, 55, 78, 87, + 86, 79, 57, 58, 59, 60, 61, 62, 63, 89, + 90, 148, 149, 150, 93, 91, 94, 152, 32, 101, + 95, 102, 101, 103, 102, 96, 103, 140, 158, 136, + 101, 101, 102, 102, 103, 103, 100, 137, 138, 101, + 101, 102, 102, 103, 103, 154, 155, 101, 101, 102, + 102, 103, 103, 156, 1, 2, 110, 3, 111, 112, + 114, 120, 105, 130, 121, 127, 129, 133, 147, 134, + 142, 151, 143, 113, 14, 157, 144, 153, 146, 145, + 82, 28, 0, 99, 0, 0, 0, 0, 68, 0, + 0, 0, 0, 56 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ - -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ +static const short yycheck[] = +{ + 55, 43, 47, 7, 8, 14, 67, 19, 10, 11, + 18, 13, 18, 27, 10, 11, 0, 13, 12, 13, + 101, 102, 83, 37, 28, 34, 28, 24, 36, 19, + 36, 27, 35, 24, 28, 23, 19, 34, 93, 94, + 95, 27, 27, 34, 29, 100, 31, 12, 90, 23, + 105, 96, 37, 24, 15, 16, 17, 18, 19, 114, + 21, 22, 34, 34, 18, 26, 27, 25, 29, 28, + 34, 32, 3, 4, 5, 6, 7, 8, 9, 23, + 23, 136, 137, 138, 32, 19, 32, 142, 19, 27, + 32, 29, 27, 31, 29, 23, 31, 35, 153, 34, + 27, 27, 29, 29, 31, 31, 19, 34, 34, 27, + 27, 29, 29, 31, 31, 33, 33, 27, 27, 29, + 29, 31, 31, 33, 10, 11, 18, 13, 18, 18, + 25, 28, 34, 37, 30, 19, 19, 24, 18, 24, + 34, 20, 33, 90, 2, 152, 28, 25, 129, 30, + 48, 17, -1, 78, -1, -1, -1, -1, 46, -1, + -1, -1, -1, 40 +}; -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include -#endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible at ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ -#endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 10, 11, 13, 68, 71, 72, 75, 77, 78, + 19, 62, 63, 64, 63, 65, 76, 27, 72, 72, + 0, 69, 35, 58, 66, 19, 73, 74, 77, 23, + 60, 61, 19, 39, 56, 57, 67, 27, 49, 14, + 34, 28, 12, 41, 52, 59, 70, 23, 34, 27, + 37, 55, 18, 47, 48, 25, 73, 3, 4, 5, + 6, 7, 8, 9, 39, 40, 24, 34, 66, 15, + 16, 17, 18, 19, 21, 22, 26, 27, 29, 32, + 43, 51, 56, 54, 18, 36, 34, 28, 43, 23, + 23, 19, 52, 32, 32, 32, 23, 50, 51, 50, + 19, 27, 29, 31, 24, 34, 13, 28, 52, 53, + 18, 18, 18, 40, 25, 42, 43, 43, 43, 51, + 28, 30, 43, 45, 46, 48, 48, 19, 43, 19, + 37, 18, 36, 24, 24, 43, 34, 34, 34, 24, + 35, 44, 34, 33, 28, 30, 49, 18, 43, 43, + 43, 20, 43, 25, 33, 33, 33, 44, 43, 37 +}; -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 +#define YYEMPTY (-2) #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab +#define YYABORT goto yyabortlab #define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + Current.first_line = Rhs[1].first_line; \ + Current.first_column = Rhs[1].first_column; \ + Current.last_line = Rhs[N].last_line; \ + Current.last_column = Rhs[N].last_column; #endif -#else /* not YYLSP_NEEDED */ + +/* YYLEX -- calling `yylex' with the right arguments. */ + #ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) +# define YYLEX yylex (YYLEX_PARAM) #else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ +# define YYLEX yylex () #endif -/* If nonreentrant, generate the variables here */ +/* Enable debugging if requested. */ +#if YYDEBUG -#ifndef YYPURE +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (cinluded). | +`------------------------------------------------------------------*/ -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; #endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; #endif +{ + int yyi; + unsigned int yylineno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylineno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -#define YYINITDEPTH 200 +# define YYINITDEPTH 200 #endif -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ #if YYMAXDEPTH == 0 -#undef YYMAXDEPTH +# undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 +# define YYMAXDEPTH 10000 #endif + -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; -{ - register char *f = from; - register char *t = to; - register int i = count; +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; - while (i-- > 0) - *t++ = *f++; + return yys - yystr - 1; } +# endif +# endif -#else /* __cplusplus */ +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else static void -__yy_memcpy (char *to, char *from, unsigned int count) +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif { - register char *t = to; - register char *f = from; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); } +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; #endif -#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} -#line 217 "/usr/share/bison.simple" -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ +/* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ #ifdef YYPARSE_PARAM -int yyparse (void *); +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) #else -int yyparse (void); +int +yyparse () + #endif #endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL { + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -766,110 +1152,96 @@ so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: + goto yysetstate; - *++yyssp = yystate; +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif + yysetstate: + *yyssp = yystate; + if (yyss + yystacksize - 1 <= yyssp) + { /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) + if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - if (yyssp >= yyss + yystacksize - 1) + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -878,236 +1250,217 @@ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ + if (yychar <= YYEOF) { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); } - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; + -/* Do a reduction. yyn is the number of a rule to reduce with. */ +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; - switch (yyn) { -case 1: -#line 223 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 2: +#line 223 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Rec = Records.getClass(*yyvsp[0].StrVal); if (yyval.Rec == 0) { err() << "Couldn't find class '" << *yyvsp[0].StrVal << "'!\n"; exit(1); } delete yyvsp[0].StrVal; - ; - break;} -case 2: -#line 234 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // string type + ;} + break; + + case 3: +#line 234 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // string type yyval.Ty = new StringRecTy(); - ; - break;} -case 3: -#line 236 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // bit type + ;} + break; + + case 4: +#line 236 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // bit type yyval.Ty = new BitRecTy(); - ; - break;} -case 4: -#line 238 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // bits type + ;} + break; + + case 5: +#line 238 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // bits type yyval.Ty = new BitsRecTy(yyvsp[-1].IntVal); - ; - break;} -case 5: -#line 240 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // int type + ;} + break; + + case 6: +#line 240 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // int type yyval.Ty = new IntRecTy(); - ; - break;} -case 6: -#line 242 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // list type + ;} + break; + + case 7: +#line 242 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // list type yyval.Ty = new ListRecTy(yyvsp[-1].Ty); - ; - break;} -case 7: -#line 244 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // code type + ;} + break; + + case 8: +#line 244 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // code type yyval.Ty = new CodeRecTy(); - ; - break;} -case 8: -#line 246 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // dag type + ;} + break; + + case 9: +#line 246 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // dag type yyval.Ty = new DagRecTy(); - ; - break;} -case 9: -#line 248 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ // Record Type + ;} + break; + + case 10: +#line 248 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // Record Type yyval.Ty = new RecordRecTy(yyvsp[0].Rec); - ; - break;} -case 10: -#line 252 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.IntVal = 0; ; - break;} -case 11: -#line 252 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.IntVal = 1; ; - break;} -case 12: -#line 254 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.Initializer = 0; ; - break;} -case 13: -#line 254 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.Initializer = yyvsp[0].Initializer; ; - break;} -case 14: -#line 256 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 11: +#line 252 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.IntVal = 0; ;} + break; + + case 12: +#line 252 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.IntVal = 1; ;} + break; + + case 13: +#line 254 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = 0; ;} + break; + + case 14: +#line 254 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = yyvsp[0].Initializer; ;} + break; + + case 15: +#line 256 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = new IntInit(yyvsp[0].IntVal); - ; - break;} -case 15: -#line 258 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 16: +#line 258 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = new StringInit(*yyvsp[0].StrVal); delete yyvsp[0].StrVal; - ; - break;} -case 16: -#line 261 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 17: +#line 261 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = new CodeInit(*yyvsp[0].StrVal); delete yyvsp[0].StrVal; - ; - break;} -case 17: -#line 264 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 18: +#line 264 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = new UnsetInit(); - ; - break;} -case 18: -#line 266 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 19: +#line 266 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { BitsInit *Init = new BitsInit(yyvsp[-1].FieldList->size()); for (unsigned i = 0, e = yyvsp[-1].FieldList->size(); i != e; ++i) { struct Init *Bit = (*yyvsp[-1].FieldList)[i]->convertInitializerTo(new BitRecTy()); @@ -1120,11 +1473,12 @@ } yyval.Initializer = Init; delete yyvsp[-1].FieldList; - ; - break;} -case 19: -#line 279 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 20: +#line 279 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // This is a CLASS expression. This is supposed to synthesize // a new anonymous definition, deriving from CLASS with no // body. @@ -1152,11 +1506,12 @@ // Restore the old CurRec CurRec = OldRec; - ; - break;} -case 20: -#line 307 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 21: +#line 307 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { if (const RecordVal *RV = (CurRec ? CurRec->getValue(*yyvsp[0].StrVal) : 0)) { yyval.Initializer = new VarInit(*yyvsp[0].StrVal, RV->getType()); } else if (CurRec && CurRec->isTemplateArg(CurRec->getName()+":"+*yyvsp[0].StrVal)) { @@ -1171,40 +1526,44 @@ } delete yyvsp[0].StrVal; - ; - break;} -case 21: -#line 322 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 22: +#line 322 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = yyvsp[-3].Initializer->convertInitializerBitRange(*yyvsp[-1].BitList); if (yyval.Initializer == 0) { err() << "Invalid bit range for value '" << *yyvsp[-3].Initializer << "'!\n"; exit(1); } delete yyvsp[-1].BitList; - ; - break;} -case 22: -#line 329 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 23: +#line 329 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = new ListInit(*yyvsp[-1].FieldList); delete yyvsp[-1].FieldList; - ; - break;} -case 23: -#line 332 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 24: +#line 332 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { if (!yyvsp[-2].Initializer->getFieldType(*yyvsp[0].StrVal)) { err() << "Cannot access field '" << *yyvsp[0].StrVal << "' of value '" << *yyvsp[-2].Initializer << "!\n"; exit(1); } yyval.Initializer = new FieldInit(yyvsp[-2].Initializer, *yyvsp[0].StrVal); delete yyvsp[0].StrVal; - ; - break;} -case 24: -#line 339 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 25: +#line 339 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { Record *D = Records.getDef(*yyvsp[-2].StrVal); if (D == 0) { err() << "Invalid def '" << *yyvsp[-2].StrVal << "'!\n"; @@ -1212,11 +1571,12 @@ } yyval.Initializer = new DagInit(D, *yyvsp[-1].DagValueList); delete yyvsp[-2].StrVal; delete yyvsp[-1].DagValueList; - ; - break;} -case 25: -#line 347 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 26: +#line 347 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { std::reverse(yyvsp[-1].BitList->begin(), yyvsp[-1].BitList->end()); yyval.Initializer = yyvsp[-3].Initializer->convertInitListSlice(*yyvsp[-1].BitList); if (yyval.Initializer == 0) { @@ -1224,86 +1584,97 @@ exit(1); } delete yyvsp[-1].BitList; - ; - break;} -case 26: -#line 355 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 27: +#line 355 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = yyvsp[-3].Initializer->getBinaryOp(Init::SHL, yyvsp[-1].Initializer); if (yyval.Initializer == 0) { err() << "Cannot shift values '" << *yyvsp[-3].Initializer << "' and '" << *yyvsp[-1].Initializer << "'!\n"; exit(1); } - ; - break;} -case 27: -#line 361 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 28: +#line 361 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = yyvsp[-3].Initializer->getBinaryOp(Init::SRA, yyvsp[-1].Initializer); if (yyval.Initializer == 0) { err() << "Cannot shift values '" << *yyvsp[-3].Initializer << "' and '" << *yyvsp[-1].Initializer << "'!\n"; exit(1); } - ; - break;} -case 28: -#line 367 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 29: +#line 367 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Initializer = yyvsp[-3].Initializer->getBinaryOp(Init::SRL, yyvsp[-1].Initializer); if (yyval.Initializer == 0) { err() << "Cannot shift values '" << *yyvsp[-3].Initializer << "' and '" << *yyvsp[-1].Initializer << "'!\n"; exit(1); } - ; - break;} -case 29: -#line 375 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 30: +#line 375 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.StrVal = new std::string(); - ; - break;} -case 30: -#line 378 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 31: +#line 378 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.StrVal = yyvsp[0].StrVal; - ; - break;} -case 31: -#line 382 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 32: +#line 382 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.DagValueList = new std::vector >(); yyval.DagValueList->push_back(std::make_pair(yyvsp[-1].Initializer, *yyvsp[0].StrVal)); delete yyvsp[0].StrVal; - ; - break;} -case 32: -#line 387 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 33: +#line 387 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyvsp[-3].DagValueList->push_back(std::make_pair(yyvsp[-1].Initializer, *yyvsp[0].StrVal)); delete yyvsp[0].StrVal; yyval.DagValueList = yyvsp[-3].DagValueList; - ; - break;} -case 33: -#line 393 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 34: +#line 393 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.DagValueList = new std::vector >(); - ; - break;} -case 34: -#line 396 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.DagValueList = yyvsp[0].DagValueList; ; - break;} -case 35: -#line 399 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 35: +#line 396 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.DagValueList = yyvsp[0].DagValueList; ;} + break; + + case 36: +#line 399 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.BitList = new std::vector(); yyval.BitList->push_back(yyvsp[0].IntVal); - ; - break;} -case 36: -#line 402 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 37: +#line 402 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { if (yyvsp[-2].IntVal < 0 || yyvsp[0].IntVal < 0) { err() << "Invalid range: " << yyvsp[-2].IntVal << "-" << yyvsp[0].IntVal << "!\n"; exit(1); @@ -1316,11 +1687,12 @@ for (int i = yyvsp[-2].IntVal; i >= yyvsp[0].IntVal; --i) yyval.BitList->push_back(i); } - ; - break;} -case 37: -#line 415 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 38: +#line 415 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyvsp[0].IntVal = -yyvsp[0].IntVal; if (yyvsp[-1].IntVal < 0 || yyvsp[0].IntVal < 0) { err() << "Invalid range: " << yyvsp[-1].IntVal << "-" << yyvsp[0].IntVal << "!\n"; @@ -1334,17 +1706,19 @@ for (int i = yyvsp[-1].IntVal; i >= yyvsp[0].IntVal; --i) yyval.BitList->push_back(i); } - ; - break;} -case 38: -#line 429 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 39: +#line 429 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { (yyval.BitList=yyvsp[-2].BitList)->push_back(yyvsp[0].IntVal); - ; - break;} -case 39: -#line 431 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 40: +#line 431 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { if (yyvsp[-2].IntVal < 0 || yyvsp[0].IntVal < 0) { err() << "Invalid range: " << yyvsp[-2].IntVal << "-" << yyvsp[0].IntVal << "!\n"; exit(1); @@ -1357,11 +1731,12 @@ for (int i = yyvsp[-2].IntVal; i >= yyvsp[0].IntVal; --i) yyval.BitList->push_back(i); } - ; - break;} -case 40: -#line 444 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 41: +#line 444 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyvsp[0].IntVal = -yyvsp[0].IntVal; if (yyvsp[-1].IntVal < 0 || yyvsp[0].IntVal < 0) { err() << "Invalid range: " << yyvsp[-1].IntVal << "-" << yyvsp[0].IntVal << "!\n"; @@ -1375,48 +1750,56 @@ for (int i = yyvsp[-1].IntVal; i >= yyvsp[0].IntVal; --i) yyval.BitList->push_back(i); } - ; - break;} -case 41: -#line 460 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.BitList = yyvsp[0].BitList; std::reverse(yyvsp[0].BitList->begin(), yyvsp[0].BitList->end()); ; - break;} -case 42: -#line 462 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.BitList = 0; ; - break;} -case 43: -#line 462 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.BitList = yyvsp[-1].BitList; ; - break;} -case 44: -#line 466 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 42: +#line 460 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.BitList = yyvsp[0].BitList; std::reverse(yyvsp[0].BitList->begin(), yyvsp[0].BitList->end()); ;} + break; + + case 43: +#line 462 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.BitList = 0; ;} + break; + + case 44: +#line 462 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.BitList = yyvsp[-1].BitList; ;} + break; + + case 45: +#line 466 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.FieldList = new std::vector(); - ; - break;} -case 45: -#line 468 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 46: +#line 468 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.FieldList = yyvsp[0].FieldList; - ; - break;} -case 46: -#line 472 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 47: +#line 472 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.FieldList = new std::vector(); yyval.FieldList->push_back(yyvsp[0].Initializer); - ; - break;} -case 47: -#line 475 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 48: +#line 475 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { (yyval.FieldList = yyvsp[-2].FieldList)->push_back(yyvsp[0].Initializer); - ; - break;} -case 48: -#line 479 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 49: +#line 479 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { std::string DecName = *yyvsp[-1].StrVal; if (ParsingTemplateArgs) DecName = CurRec->getName() + ":" + DecName; @@ -1424,99 +1807,114 @@ addValue(RecordVal(DecName, yyvsp[-2].Ty, yyvsp[-3].IntVal)); setValue(DecName, 0, yyvsp[0].Initializer); yyval.StrVal = new std::string(DecName); -; - break;} -case 49: -#line 489 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 50: +#line 489 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { delete yyvsp[-1].StrVal; -; - break;} -case 50: -#line 491 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 51: +#line 491 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { setValue(*yyvsp[-4].StrVal, yyvsp[-3].BitList, yyvsp[-1].Initializer); delete yyvsp[-4].StrVal; delete yyvsp[-3].BitList; -; - break;} -case 55: -#line 500 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 56: +#line 500 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.SubClassRef = new SubClassRefTy(yyvsp[0].Rec, new std::vector()); - ; - break;} -case 56: -#line 502 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 57: +#line 502 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.SubClassRef = new SubClassRefTy(yyvsp[-3].Rec, yyvsp[-1].FieldList); - ; - break;} -case 57: -#line 506 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 58: +#line 506 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.SubClassList = new std::vector(); yyval.SubClassList->push_back(*yyvsp[0].SubClassRef); delete yyvsp[0].SubClassRef; - ; - break;} -case 58: -#line 511 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 59: +#line 511 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { (yyval.SubClassList=yyvsp[-2].SubClassList)->push_back(*yyvsp[0].SubClassRef); delete yyvsp[0].SubClassRef; - ; - break;} -case 59: -#line 516 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 60: +#line 516 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.SubClassList = new std::vector(); - ; - break;} -case 60: -#line 519 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 61: +#line 519 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.SubClassList = yyvsp[0].SubClassList; - ; - break;} -case 61: -#line 523 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 62: +#line 523 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { CurRec->addTemplateArg(*yyvsp[0].StrVal); delete yyvsp[0].StrVal; -; - break;} -case 62: -#line 526 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 63: +#line 526 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { CurRec->addTemplateArg(*yyvsp[0].StrVal); delete yyvsp[0].StrVal; -; - break;} -case 63: -#line 531 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{; - break;} -case 66: -#line 534 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.StrVal = yyvsp[0].StrVal; ; - break;} -case 67: -#line 534 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ yyval.StrVal = new std::string(); ; - break;} -case 68: -#line 536 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 64: +#line 531 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + {;} + break; + + case 67: +#line 534 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.StrVal = yyvsp[0].StrVal; ;} + break; + + case 68: +#line 534 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.StrVal = new std::string(); ;} + break; + + case 69: +#line 536 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { static unsigned AnonCounter = 0; if (yyvsp[0].StrVal->empty()) *yyvsp[0].StrVal = "anonymous."+utostr(AnonCounter++); yyval.StrVal = yyvsp[0].StrVal; -; - break;} -case 69: -#line 543 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 70: +#line 543 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { // If a class of this name already exists, it must be a forward ref. if ((CurRec = Records.getClass(*yyvsp[0].StrVal))) { // If the body was previously defined, this is an error. @@ -1532,11 +1930,12 @@ Records.addClass(CurRec); } delete yyvsp[0].StrVal; -; - break;} -case 70: -#line 561 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 71: +#line 561 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { CurRec = new Record(*yyvsp[0].StrVal); delete yyvsp[0].StrVal; @@ -1546,11 +1945,12 @@ exit(1); } Records.addDef(CurRec); -; - break;} -case 71: -#line 573 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 72: +#line 573 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { for (unsigned i = 0, e = yyvsp[0].SubClassList->size(); i != e; ++i) { addSubClass((*yyvsp[0].SubClassList)[i].first, *(*yyvsp[0].SubClassList)[i].second); // Delete the template arg values for the class @@ -1564,304 +1964,294 @@ setValue(LetStack[i][j].Name, LetStack[i][j].HasBits ? &LetStack[i][j].Bits : 0, LetStack[i][j].Value); - ; - break;} -case 72: -#line 587 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 73: +#line 587 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Rec = CurRec; CurRec = 0; - ; - break;} -case 73: -#line 592 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 74: +#line 592 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { ParsingTemplateArgs = true; - ; - break;} -case 74: -#line 594 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 75: +#line 594 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { ParsingTemplateArgs = false; - ; - break;} -case 75: -#line 596 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 76: +#line 596 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyval.Rec = yyvsp[0].Rec; - ; - break;} -case 76: -#line 600 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 77: +#line 600 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { yyvsp[0].Rec->resolveReferences(); // If ObjectBody has template arguments, it's an error. assert(yyvsp[0].Rec->getTemplateArgs().empty() && "How'd this get template args?"); yyval.Rec = yyvsp[0].Rec; -; - break;} -case 79: -#line 611 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 80: +#line 611 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { LetStack.back().push_back(LetRecord(*yyvsp[-3].StrVal, yyvsp[-2].BitList, yyvsp[0].Initializer)); delete yyvsp[-3].StrVal; delete yyvsp[-2].BitList; -; - break;} -case 82: -#line 619 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ LetStack.push_back(std::vector()); ; - break;} -case 84: -#line 622 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ +;} + break; + + case 83: +#line 619 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { LetStack.push_back(std::vector()); ;} + break; + + case 85: +#line 622 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { LetStack.pop_back(); - ; - break;} -case 85: -#line 625 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{ + ;} + break; + + case 86: +#line 625 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + { LetStack.pop_back(); - ; - break;} -case 86: -#line 629 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{; - break;} -case 87: -#line 629 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{; - break;} -case 88: -#line 631 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" -{; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + ;} + break; + + case 87: +#line 629 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + {;} + break; + + case 88: +#line 629 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + {;} + break; + + case 89: +#line 631 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" + {;} + break; + + + } + +/* Line 999 of yacc.c. */ +#line 2056 "FileParser.tab.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif + + YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + char *yymsg; + int yyx, yycount; + + yycount = 0; + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + yysize += yystrlen (yytname[yyx]) + 15, yycount++; + yysize += yystrlen ("syntax error, unexpected ") + 1; + yysize += yystrlen (yytname[yytype]); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yycount = 0; + for (yyx = yyn < 0 ? -yyn : 0; + yyx < (int) (sizeof (yytname) / sizeof (char *)); + yyx++) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + const char *yyq = ! yycount ? ", expecting " : " or "; + yyp = yystpcpy (yyp, yyq); + yyp = yystpcpy (yyp, yytname[yyx]); + yycount++; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("syntax error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("syntax error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ - /* return failure if at end of input */ + /* Return failure if at end of input. */ if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif + { + /* Pop the error token. */ + YYPOPSTACK; + /* Pop the rest of the stack. */ + while (yyss < yyssp) + { + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + YYPOPSTACK; + } + YYABORT; + } + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); yychar = YYEMPTY; - } - - /* Else will try to reuse lookahead token - after shifting the error token. */ - yyerrstatus = 3; /* Each real token shifted decrements this */ - - goto yyerrhandle; - -yyerrdefault: /* current state does not do anything special for the error token. */ + } -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; -#endif + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; -yyerrpop: /* pop the current state because it cannot handle the error token */ - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif +/*----------------------------------------------------. +| yyerrlab1 -- error raised explicitly by an action. | +`----------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ -#if YYDEBUG != 0 - if (yydebug) + for (;;) { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif - -yyerrhandle: + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + yyvsp--; + yystate = *--yyssp; - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; + YY_STACK_PRINT (yyss, yyssp); } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 633 "/Users/bocchino/vllvm-checkin/src/utils/TableGen/FileParser.y" + + +#line 633 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" int yyerror(const char *ErrorMsg) { err() << "Error parsing: " << ErrorMsg << "\n"; exit(1); } + Index: llvm/utils/TableGen/FileParser.h diff -u llvm/utils/TableGen/FileParser.h:1.4 llvm/utils/TableGen/FileParser.h:1.5 --- llvm/utils/TableGen/FileParser.h:1.4 Thu Sep 29 23:11:27 2005 +++ llvm/utils/TableGen/FileParser.h Tue Jan 17 11:01:34 2006 @@ -1,4 +1,83 @@ -typedef union { +/* A Bison parser, made by GNU Bison 1.875. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + INT = 258, + BIT = 259, + STRING = 260, + BITS = 261, + LIST = 262, + CODE = 263, + DAG = 264, + CLASS = 265, + DEF = 266, + FIELD = 267, + LET = 268, + IN = 269, + SHLTOK = 270, + SRATOK = 271, + SRLTOK = 272, + INTVAL = 273, + ID = 274, + VARNAME = 275, + STRVAL = 276, + CODEFRAGMENT = 277 + }; +#endif +#define INT 258 +#define BIT 259 +#define STRING 260 +#define BITS 261 +#define LIST 262 +#define CODE 263 +#define DAG 264 +#define CLASS 265 +#define DEF 266 +#define FIELD 267 +#define LET 268 +#define IN 269 +#define SHLTOK 270 +#define SRATOK 271 +#define SRLTOK 272 +#define INTVAL 273 +#define ID 274 +#define VARNAME 275 +#define STRVAL 276 +#define CODEFRAGMENT 277 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 189 "/home/vadve/criswell/llvm/utils/TableGen/FileParser.y" +typedef union YYSTYPE { std::string* StrVal; int IntVal; llvm::RecTy* Ty; @@ -10,26 +89,14 @@ std::vector* SubClassList; std::vector >* DagValueList; } YYSTYPE; -#define INT 257 -#define BIT 258 -#define STRING 259 -#define BITS 260 -#define LIST 261 -#define CODE 262 -#define DAG 263 -#define CLASS 264 -#define DEF 265 -#define FIELD 266 -#define LET 267 -#define IN 268 -#define SHLTOK 269 -#define SRATOK 270 -#define SRLTOK 271 -#define INTVAL 272 -#define ID 273 -#define VARNAME 274 -#define STRVAL 275 -#define CODEFRAGMENT 276 - +/* Line 1240 of yacc.c. */ +#line 93 "FileParser.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif extern YYSTYPE Filelval; + + + From jlaskey at apple.com Tue Jan 17 11:29:32 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 11:29:32 -0600 Subject: [llvm-commits] CVS: llvm/Xcode/LLVM.xcodeproj/project.pbxproj Message-ID: <200601171729.LAA05751@zion.cs.uiuc.edu> Changes in directory llvm/Xcode/LLVM.xcodeproj: project.pbxproj updated: 1.16 -> 1.17 --- Log message: Adding UniqueVector. --- Diffs of the changes: (+2 -0) project.pbxproj | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/Xcode/LLVM.xcodeproj/project.pbxproj diff -u llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.16 llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.17 --- llvm/Xcode/LLVM.xcodeproj/project.pbxproj:1.16 Wed Jan 4 07:37:32 2006 +++ llvm/Xcode/LLVM.xcodeproj/project.pbxproj Tue Jan 17 11:29:20 2006 @@ -131,6 +131,7 @@ CFC244BF0959F2E3009F8C47 /* IA64ISelDAGToDAG.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IA64ISelDAGToDAG.cpp; sourceTree = ""; }; CFC244C00959F2E3009F8C47 /* IA64ISelLowering.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IA64ISelLowering.cpp; sourceTree = ""; }; CFC244C10959F2E3009F8C47 /* IA64ISelLowering.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IA64ISelLowering.h; sourceTree = ""; }; + CFF8B434097C605F0047F72A /* UniqueVector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqueVector.h; sourceTree = ""; }; DE4DA0390911476D0012D44B /* LoopSimplify.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = LoopSimplify.cpp; path = ../lib/Transforms/Utils/LoopSimplify.cpp; sourceTree = SOURCE_ROOT; }; DE4DA03C091147920012D44B /* LiveInterval.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = LiveInterval.h; path = ../include/llvm/CodeGen/LiveInterval.h; sourceTree = SOURCE_ROOT; }; DE4DA03D091147920012D44B /* LiveIntervalAnalysis.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = LiveIntervalAnalysis.h; path = ../include/llvm/CodeGen/LiveIntervalAnalysis.h; sourceTree = SOURCE_ROOT; }; @@ -1898,6 +1899,7 @@ DE66F1FF08ABF03100323D32 /* STLExtras.h */, DE66F20008ABF03100323D32 /* StringExtras.h */, DE66F20108ABF03100323D32 /* Tree.h */, + CFF8B434097C605F0047F72A /* UniqueVector.h */, DE66F20208ABF03100323D32 /* VectorExtras.h */, ); path = ADT; From jlaskey at apple.com Tue Jan 17 11:32:07 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 11:32:07 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200601171732.LAA05797@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.136 -> 1.137 --- Log message: Adding basic support for Dwarf line number debug information. I promise to keep future commits smaller. --- Diffs of the changes: (+8 -6) PPCAsmPrinter.cpp | 14 ++++++++------ 1 files changed, 8 insertions(+), 6 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.136 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.137 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.136 Wed Jan 4 19:25:28 2006 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Tue Jan 17 11:31:53 2006 @@ -215,9 +215,11 @@ : DwarfWriter(o, ap) { needsSet = true; - DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev,regular,debug"; - DwarfInfoSection = ".section __DWARFA,__debug_info,regular,debug"; - DwarfLineSection = ".section __DWARFA,__debug_line,regular,debug"; + DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug"; + DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug"; + DwarfLineSection = ".section __DWARF,__debug_line,regular,debug"; + TextSection = ".text"; + DataSection = ".data"; } }; @@ -607,6 +609,9 @@ } } + // Emit initial debug information. + DW.EndModule(); + // Funny Darwin hack: This flag tells the linker that no global symbols // contain code that falls through to other global symbols (e.g. the obvious // implementation of multiple entry points). If this doesn't occur, the @@ -614,9 +619,6 @@ // code that does this, it is always safe to set. O << "\t.subsections_via_symbols\n"; - // Emit initial debug information. - DW.EndModule(); - AsmPrinter::doFinalization(M); return false; // success } From jlaskey at apple.com Tue Jan 17 11:32:08 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 11:32:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601171732.LAA05813@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.267 -> 1.268 --- Log message: Adding basic support for Dwarf line number debug information. I promise to keep future commits smaller. --- 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.267 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.268 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.267 Mon Jan 16 01:59:13 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Jan 17 11:31:53 2006 @@ -627,7 +627,7 @@ cast(Node->getOperand(3))->getValue(); const std::string &DirName = cast(Node->getOperand(4))->getValue(); - unsigned SrcFile = DebugInfo->getUniqueSourceID(FName, DirName); + unsigned SrcFile = DebugInfo->RecordSource(DirName, FName); std::vector Ops; Ops.push_back(Tmp1); // chain From jlaskey at apple.com Tue Jan 17 11:32:07 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 11:32:07 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp MachineDebugInfo.cpp Message-ID: <200601171732.LAA05803@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.5 -> 1.6 MachineDebugInfo.cpp updated: 1.3 -> 1.4 --- Log message: Adding basic support for Dwarf line number debug information. I promise to keep future commits smaller. --- Diffs of the changes: (+1272 -114) DwarfWriter.cpp | 1344 ++++++++++++++++++++++++++++++++++++++++++++++++--- MachineDebugInfo.cpp | 42 - 2 files changed, 1272 insertions(+), 114 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.5 llvm/lib/CodeGen/DwarfWriter.cpp:1.6 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.5 Wed Jan 4 16:28:25 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Tue Jan 17 11:31:53 2006 @@ -13,6 +13,7 @@ #include "llvm/CodeGen/DwarfWriter.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/CodeGen/AsmPrinter.h" #include "llvm/CodeGen/MachineDebugInfo.h" #include "llvm/Support/CommandLine.h" @@ -23,90 +24,776 @@ static cl::opt DwarfVerbose("dwarf-verbose", cl::Hidden, - cl::desc("Add comments to dwarf directives.")); + cl::desc("Add comments to Dwarf directives.")); -/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an -/// unsigned leb128 value. Comment is added to the end of the directive if -/// DwarfVerbose is true (should not contain any newlines.) +//===----------------------------------------------------------------------===// +// Dwarf abbreviations used by this emitter. +// + +static const unsigned char AbbrevTAG_compile_unit[] = { + DW_TAG_compile_unit, DW_CHILDREN_yes, + DW_AT_stmt_list, DW_FORM_data4, + DW_AT_high_pc, DW_FORM_addr, + DW_AT_low_pc, DW_FORM_addr, + DW_AT_producer, DW_FORM_string, + DW_AT_language, DW_FORM_data1, + DW_AT_name, DW_FORM_string, + DW_AT_comp_dir, DW_FORM_string, + 0, 0 +}; + +static const unsigned char AbbrevTAG_subprogram[] = { + DW_TAG_subprogram, DW_CHILDREN_yes, + DW_AT_sibling, DW_FORM_ref4, + DW_AT_external, DW_FORM_flag, + DW_AT_name, DW_FORM_string, + DW_AT_decl_file, DW_FORM_data1, + DW_AT_decl_line, DW_FORM_data1, + DW_AT_prototyped, DW_FORM_flag, + DW_AT_type, DW_FORM_ref4, + DW_AT_low_pc, DW_FORM_addr, + DW_AT_high_pc, DW_FORM_addr, + DW_AT_frame_base, DW_FORM_block1, + 0, 0 +}; + +static const unsigned char AbbrevTAG_formal_parameter[] = { + DW_TAG_formal_parameter, DW_CHILDREN_no, + DW_AT_name, DW_FORM_string, + DW_AT_decl_file, DW_FORM_data1, + DW_AT_decl_line, DW_FORM_data1, + DW_AT_type, DW_FORM_ref4, + DW_AT_location, DW_FORM_block1, + 0, 0 +}; + +static const unsigned char AbbrevTAG_base_type[] = { + DW_TAG_base_type, DW_CHILDREN_no, + DW_AT_name, DW_FORM_string, + DW_AT_byte_size, DW_FORM_data1, + DW_AT_encoding, DW_FORM_data1, + 0, 0 +}; + +static const unsigned char AbbrevTAG_pointer_type[] = { + DW_TAG_pointer_type, DW_CHILDREN_no, + DW_AT_byte_size, DW_FORM_data1, + DW_AT_type, DW_FORM_ref4, + 0, 0 +}; + +static const unsigned char AbbrevTAG_array_type[] = { + DW_TAG_array_type, DW_CHILDREN_yes, + DW_AT_sibling, DW_FORM_ref4, + DW_AT_type, DW_FORM_ref4, + 0, 0 +}; + +static const unsigned char AbbrevTAG_subrange_type[] = { + DW_TAG_subrange_type, DW_CHILDREN_no, + 0, 0 +}; + +static const unsigned char AbbrevTAG_variable[] = { + DW_TAG_variable, DW_CHILDREN_no, + DW_AT_name, DW_FORM_string, + DW_AT_type, DW_FORM_ref4, + DW_AT_external, DW_FORM_flag, + DW_AT_artificial, DW_FORM_flag, + DW_AT_declaration, DW_FORM_flag, + 0, 0 +}; + +//===----------------------------------------------------------------------===// + +/// TagString - Return the string for the specified tag. /// -void DwarfWriter::EmitULEB128Bytes(unsigned Value, const char *Comment) const { - if (hasLEB128) { - O << "\t.uleb128\t" - << Value; - } else { - O << Asm->Data8bitsDirective; - EmitULEB128(Value); +static const char *TagString(unsigned Tag) { + switch(Tag) { + case DW_TAG_array_type: return "TAG_array_type"; + case DW_TAG_class_type: return "TAG_class_type"; + case DW_TAG_entry_point: return "TAG_entry_point"; + case DW_TAG_enumeration_type: return "TAG_enumeration_type"; + case DW_TAG_formal_parameter: return "TAG_formal_parameter"; + case DW_TAG_imported_declaration: return "TAG_imported_declaration"; + case DW_TAG_label: return "TAG_label"; + case DW_TAG_lexical_block: return "TAG_lexical_block"; + case DW_TAG_member: return "TAG_member"; + case DW_TAG_pointer_type: return "TAG_pointer_type"; + case DW_TAG_reference_type: return "TAG_reference_type"; + case DW_TAG_compile_unit: return "TAG_compile_unit"; + case DW_TAG_string_type: return "TAG_string_type"; + case DW_TAG_structure_type: return "TAG_structure_type"; + case DW_TAG_subroutine_type: return "TAG_subroutine_type"; + case DW_TAG_typedef: return "TAG_typedef"; + case DW_TAG_union_type: return "TAG_union_type"; + case DW_TAG_unspecified_parameters: return "TAG_unspecified_parameters"; + case DW_TAG_variant: return "TAG_variant"; + case DW_TAG_common_block: return "TAG_common_block"; + case DW_TAG_common_inclusion: return "TAG_common_inclusion"; + case DW_TAG_inheritance: return "TAG_inheritance"; + case DW_TAG_inlined_subroutine: return "TAG_inlined_subroutine"; + case DW_TAG_module: return "TAG_module"; + case DW_TAG_ptr_to_member_type: return "TAG_ptr_to_member_type"; + case DW_TAG_set_type: return "TAG_set_type"; + case DW_TAG_subrange_type: return "TAG_subrange_type"; + case DW_TAG_with_stmt: return "TAG_with_stmt"; + case DW_TAG_access_declaration: return "TAG_access_declaration"; + case DW_TAG_base_type: return "TAG_base_type"; + case DW_TAG_catch_block: return "TAG_catch_block"; + case DW_TAG_const_type: return "TAG_const_type"; + case DW_TAG_constant: return "TAG_constant"; + case DW_TAG_enumerator: return "TAG_enumerator"; + case DW_TAG_file_type: return "TAG_file_type"; + case DW_TAG_friend: return "TAG_friend"; + case DW_TAG_namelist: return "TAG_namelist"; + case DW_TAG_namelist_item: return "TAG_namelist_item"; + case DW_TAG_packed_type: return "TAG_packed_type"; + case DW_TAG_subprogram: return "TAG_subprogram"; + case DW_TAG_template_type_parameter: return "TAG_template_type_parameter"; + case DW_TAG_template_value_parameter: return "TAG_template_value_parameter"; + case DW_TAG_thrown_type: return "TAG_thrown_type"; + case DW_TAG_try_block: return "TAG_try_block"; + case DW_TAG_variant_part: return "TAG_variant_part"; + case DW_TAG_variable: return "TAG_variable"; + case DW_TAG_volatile_type: return "TAG_volatile_type"; + case DW_TAG_dwarf_procedure: return "TAG_dwarf_procedure"; + case DW_TAG_restrict_type: return "TAG_restrict_type"; + case DW_TAG_interface_type: return "TAG_interface_type"; + case DW_TAG_namespace: return "TAG_namespace"; + case DW_TAG_imported_module: return "TAG_imported_module"; + case DW_TAG_unspecified_type: return "TAG_unspecified_type"; + case DW_TAG_partial_unit: return "TAG_partial_unit"; + case DW_TAG_imported_unit: return "TAG_imported_unit"; + case DW_TAG_condition: return "TAG_condition"; + case DW_TAG_shared_type: return "TAG_shared_type"; + case DW_TAG_lo_user: return "TAG_lo_user"; + case DW_TAG_hi_user: return "TAG_hi_user"; } - if (DwarfVerbose) { - O << "\t" - << Asm->CommentString - << " " - << Comment - << " " - << Value; + assert(0 && "Unknown Dwarf Tag"); + return ""; +} + +/// ChildrenString - Return the string for the specified children flag. +/// +static const char *ChildrenString(unsigned Children) { + switch(Children) { + case DW_CHILDREN_no: return "CHILDREN_no"; + case DW_CHILDREN_yes: return "CHILDREN_yes"; } - O << "\n"; + assert(0 && "Unknown Dwarf ChildrenFlag"); + return ""; } -/// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a -/// signed leb128 value. Comment is added to the end of the directive if -/// DwarfVerbose is true (should not contain any newlines.) +/// AttributeString - Return the string for the specified attribute. /// -void DwarfWriter::EmitSLEB128Bytes(int Value, const char *Comment) const { - if (hasLEB128) { - O << "\t.sleb128\t" - << Value; - } else { - O << Asm->Data8bitsDirective; - EmitSLEB128(Value); +static const char *AttributeString(unsigned Attribute) { + switch(Attribute) { + case DW_AT_sibling: return "AT_sibling"; + case DW_AT_location: return "AT_location"; + case DW_AT_name: return "AT_name"; + case DW_AT_ordering: return "AT_ordering"; + case DW_AT_byte_size: return "AT_byte_size"; + case DW_AT_bit_offset: return "AT_bit_offset"; + case DW_AT_bit_size: return "AT_bit_size"; + case DW_AT_stmt_list: return "AT_stmt_list"; + case DW_AT_low_pc: return "AT_low_pc"; + case DW_AT_high_pc: return "AT_high_pc"; + case DW_AT_language: return "AT_language"; + case DW_AT_discr: return "AT_discr"; + case DW_AT_discr_value: return "AT_discr_value"; + case DW_AT_visibility: return "AT_visibility"; + case DW_AT_import: return "AT_import"; + case DW_AT_string_length: return "AT_string_length"; + case DW_AT_common_reference: return "AT_common_reference"; + case DW_AT_comp_dir: return "AT_comp_dir"; + case DW_AT_const_value: return "AT_const_value"; + case DW_AT_containing_type: return "AT_containing_type"; + case DW_AT_default_value: return "AT_default_value"; + case DW_AT_inline: return "AT_inline"; + case DW_AT_is_optional: return "AT_is_optional"; + case DW_AT_lower_bound: return "AT_lower_bound"; + case DW_AT_producer: return "AT_producer"; + case DW_AT_prototyped: return "AT_prototyped"; + case DW_AT_return_addr: return "AT_return_addr"; + case DW_AT_start_scope: return "AT_start_scope"; + case DW_AT_bit_stride: return "AT_bit_stride"; + case DW_AT_upper_bound: return "AT_upper_bound"; + case DW_AT_abstract_origin: return "AT_abstract_origin"; + case DW_AT_accessibility: return "AT_accessibility"; + case DW_AT_address_class: return "AT_address_class"; + case DW_AT_artificial: return "AT_artificial"; + case DW_AT_base_types: return "AT_base_types"; + case DW_AT_calling_convention: return "AT_calling_convention"; + case DW_AT_count: return "AT_count"; + case DW_AT_data_member_location: return "AT_data_member_location"; + case DW_AT_decl_column: return "AT_decl_column"; + case DW_AT_decl_file: return "AT_decl_file"; + case DW_AT_decl_line: return "AT_decl_line"; + case DW_AT_declaration: return "AT_declaration"; + case DW_AT_discr_list: return "AT_discr_list"; + case DW_AT_encoding: return "AT_encoding"; + case DW_AT_external: return "AT_external"; + case DW_AT_frame_base: return "AT_frame_base"; + case DW_AT_friend: return "AT_friend"; + case DW_AT_identifier_case: return "AT_identifier_case"; + case DW_AT_macro_info: return "AT_macro_info"; + case DW_AT_namelist_item: return "AT_namelist_item"; + case DW_AT_priority: return "AT_priority"; + case DW_AT_segment: return "AT_segment"; + case DW_AT_specification: return "AT_specification"; + case DW_AT_static_link: return "AT_static_link"; + case DW_AT_type: return "AT_type"; + case DW_AT_use_location: return "AT_use_location"; + case DW_AT_variable_parameter: return "AT_variable_parameter"; + case DW_AT_virtuality: return "AT_virtuality"; + case DW_AT_vtable_elem_location: return "AT_vtable_elem_location"; + case DW_AT_allocated: return "AT_allocated"; + case DW_AT_associated: return "AT_associated"; + case DW_AT_data_location: return "AT_data_location"; + case DW_AT_byte_stride: return "AT_byte_stride"; + case DW_AT_entry_pc: return "AT_entry_pc"; + case DW_AT_use_UTF8: return "AT_use_UTF8"; + case DW_AT_extension: return "AT_extension"; + case DW_AT_ranges: return "AT_ranges"; + case DW_AT_trampoline: return "AT_trampoline"; + case DW_AT_call_column: return "AT_call_column"; + case DW_AT_call_file: return "AT_call_file"; + case DW_AT_call_line: return "AT_call_line"; + case DW_AT_description: return "AT_description"; + case DW_AT_binary_scale: return "AT_binary_scale"; + case DW_AT_decimal_scale: return "AT_decimal_scale"; + case DW_AT_small: return "AT_small"; + case DW_AT_decimal_sign: return "AT_decimal_sign"; + case DW_AT_digit_count: return "AT_digit_count"; + case DW_AT_picture_string: return "AT_picture_string"; + case DW_AT_mutable: return "AT_mutable"; + case DW_AT_threads_scaled: return "AT_threads_scaled"; + case DW_AT_explicit: return "AT_explicit"; + case DW_AT_object_pointer: return "AT_object_pointer"; + case DW_AT_endianity: return "AT_endianity"; + case DW_AT_elemental: return "AT_elemental"; + case DW_AT_pure: return "AT_pure"; + case DW_AT_recursive: return "AT_recursive"; + case DW_AT_lo_user: return "AT_lo_user"; + case DW_AT_hi_user: return "AT_hi_user"; + } + assert(0 && "Unknown Dwarf Attribute"); + return ""; +} + +/// FormEncodingString - Return the string for the specified form encoding. +/// +static const char *FormEncodingString(unsigned Encoding) { + switch(Encoding) { + case DW_FORM_addr: return "FORM_addr"; + case DW_FORM_block2: return "FORM_block2"; + case DW_FORM_block4: return "FORM_block4"; + case DW_FORM_data2: return "FORM_data2"; + case DW_FORM_data4: return "FORM_data4"; + case DW_FORM_data8: return "FORM_data8"; + case DW_FORM_string: return "FORM_string"; + case DW_FORM_block: return "FORM_block"; + case DW_FORM_block1: return "FORM_block1"; + case DW_FORM_data1: return "FORM_data1"; + case DW_FORM_flag: return "FORM_flag"; + case DW_FORM_sdata: return "FORM_sdata"; + case DW_FORM_strp: return "FORM_strp"; + case DW_FORM_udata: return "FORM_udata"; + case DW_FORM_ref_addr: return "FORM_ref_addr"; + case DW_FORM_ref1: return "FORM_ref1"; + case DW_FORM_ref2: return "FORM_ref2"; + case DW_FORM_ref4: return "FORM_ref4"; + case DW_FORM_ref8: return "FORM_ref8"; + case DW_FORM_ref_udata: return "FORM_ref_udata"; + case DW_FORM_indirect: return "FORM_indirect"; + } + assert(0 && "Unknown Dwarf Form Encoding"); + return ""; +} + +/// OperationEncodingString - Return the string for the specified operation +/// encoding. +static const char *OperationEncodingString(unsigned Encoding) { + switch(Encoding) { + case DW_OP_addr: return "OP_addr"; + case DW_OP_deref: return "OP_deref"; + case DW_OP_const1u: return "OP_const1u"; + case DW_OP_const1s: return "OP_const1s"; + case DW_OP_const2u: return "OP_const2u"; + case DW_OP_const2s: return "OP_const2s"; + case DW_OP_const4u: return "OP_const4u"; + case DW_OP_const4s: return "OP_const4s"; + case DW_OP_const8u: return "OP_const8u"; + case DW_OP_const8s: return "OP_const8s"; + case DW_OP_constu: return "OP_constu"; + case DW_OP_consts: return "OP_consts"; + case DW_OP_dup: return "OP_dup"; + case DW_OP_drop: return "OP_drop"; + case DW_OP_over: return "OP_over"; + case DW_OP_pick: return "OP_pick"; + case DW_OP_swap: return "OP_swap"; + case DW_OP_rot: return "OP_rot"; + case DW_OP_xderef: return "OP_xderef"; + case DW_OP_abs: return "OP_abs"; + case DW_OP_and: return "OP_and"; + case DW_OP_div: return "OP_div"; + case DW_OP_minus: return "OP_minus"; + case DW_OP_mod: return "OP_mod"; + case DW_OP_mul: return "OP_mul"; + case DW_OP_neg: return "OP_neg"; + case DW_OP_not: return "OP_not"; + case DW_OP_or: return "OP_or"; + case DW_OP_plus: return "OP_plus"; + case DW_OP_plus_uconst: return "OP_plus_uconst"; + case DW_OP_shl: return "OP_shl"; + case DW_OP_shr: return "OP_shr"; + case DW_OP_shra: return "OP_shra"; + case DW_OP_xor: return "OP_xor"; + case DW_OP_skip: return "OP_skip"; + case DW_OP_bra: return "OP_bra"; + case DW_OP_eq: return "OP_eq"; + case DW_OP_ge: return "OP_ge"; + case DW_OP_gt: return "OP_gt"; + case DW_OP_le: return "OP_le"; + case DW_OP_lt: return "OP_lt"; + case DW_OP_ne: return "OP_ne"; + case DW_OP_lit0: return "OP_lit0"; + case DW_OP_lit1: return "OP_lit1"; + case DW_OP_lit31: return "OP_lit31"; + case DW_OP_reg0: return "OP_reg0"; + case DW_OP_reg1: return "OP_reg1"; + case DW_OP_reg31: return "OP_reg31"; + case DW_OP_breg0: return "OP_breg0"; + case DW_OP_breg1: return "OP_breg1"; + case DW_OP_breg31: return "OP_breg31"; + case DW_OP_regx: return "OP_regx"; + case DW_OP_fbreg: return "OP_fbreg"; + case DW_OP_bregx: return "OP_bregx"; + case DW_OP_piece: return "OP_piece"; + case DW_OP_deref_size: return "OP_deref_size"; + case DW_OP_xderef_size: return "OP_xderef_size"; + case DW_OP_nop: return "OP_nop"; + case DW_OP_push_object_address: return "OP_push_object_address"; + case DW_OP_call2: return "OP_call2"; + case DW_OP_call4: return "OP_call4"; + case DW_OP_call_ref: return "OP_call_ref"; + case DW_OP_form_tls_address: return "OP_form_tls_address"; + case DW_OP_call_frame_cfa: return "OP_call_frame_cfa"; + case DW_OP_lo_user: return "OP_lo_user"; + case DW_OP_hi_user: return "OP_hi_user"; + } + assert(0 && "Unknown Dwarf Operation Encoding"); + return ""; +} + +/// AttributeEncodingString - Return the string for the specified attribute +/// encoding. +static const char *AttributeEncodingString(unsigned Encoding) { + switch(Encoding) { + case DW_ATE_address: return "ATE_address"; + case DW_ATE_boolean: return "ATE_boolean"; + case DW_ATE_complex_float: return "ATE_complex_float"; + case DW_ATE_float: return "ATE_float"; + case DW_ATE_signed: return "ATE_signed"; + case DW_ATE_signed_char: return "ATE_signed_char"; + case DW_ATE_unsigned: return "ATE_unsigned"; + case DW_ATE_unsigned_char: return "ATE_unsigned_char"; + case DW_ATE_imaginary_float: return "ATE_imaginary_float"; + case DW_ATE_packed_decimal: return "ATE_packed_decimal"; + case DW_ATE_numeric_string: return "ATE_numeric_string"; + case DW_ATE_edited: return "ATE_edited"; + case DW_ATE_signed_fixed: return "ATE_signed_fixed"; + case DW_ATE_unsigned_fixed: return "ATE_unsigned_fixed"; + case DW_ATE_decimal_float: return "ATE_decimal_float"; + case DW_ATE_lo_user: return "ATE_lo_user"; + case DW_ATE_hi_user: return "ATE_hi_user"; + } + assert(0 && "Unknown Dwarf Attribute Encoding"); + return ""; +} + +/// DecimalSignString - Return the string for the specified decimal sign +/// attribute. +static const char *DecimalSignString(unsigned Sign) { + switch(Sign) { + case DW_DS_unsigned: return "DS_unsigned"; + case DW_DS_leading_overpunch: return "DS_leading_overpunch"; + case DW_DS_trailing_overpunch: return "DS_trailing_overpunch"; + case DW_DS_leading_separate: return "DS_leading_separate"; + case DW_DS_trailing_separate: return "DS_trailing_separate"; + } + assert(0 && "Unknown Dwarf Decimal Sign Attribute"); + return ""; +} + +/// EndianityString - Return the string for the specified endianity. +/// +static const char *EndianityString(unsigned Endian) { + switch(Endian) { + case DW_END_default: return "END_default"; + case DW_END_big: return "END_big"; + case DW_END_little: return "END_little"; + case DW_END_lo_user: return "END_lo_user"; + case DW_END_hi_user: return "END_hi_user"; + } + assert(0 && "Unknown Dwarf Endianity"); + return ""; +} + +/// AccessibilityString - Return the string for the specified accessibility. +/// +static const char *AccessibilityString(unsigned Access) { + switch(Access) { + // Accessibility codes + case DW_ACCESS_public: return "ACCESS_public"; + case DW_ACCESS_protected: return "ACCESS_protected"; + case DW_ACCESS_private: return "ACCESS_private"; + } + assert(0 && "Unknown Dwarf Accessibility"); + return ""; +} + +/// VisibilityString - Return the string for the specified visibility. +/// +static const char *VisibilityString(unsigned Visibility) { + switch(Visibility) { + case DW_VIS_local: return "VIS_local"; + case DW_VIS_exported: return "VIS_exported"; + case DW_VIS_qualified: return "VIS_qualified"; + } + assert(0 && "Unknown Dwarf Visibility"); + return ""; +} + +/// VirtualityString - Return the string for the specified virtuality. +/// +static const char *VirtualityString(unsigned Virtuality) { + switch(Virtuality) { + case DW_VIRTUALITY_none: return "VIRTUALITY_none"; + case DW_VIRTUALITY_virtual: return "VIRTUALITY_virtual"; + case DW_VIRTUALITY_pure_virtual: return "VIRTUALITY_pure_virtual"; + } + assert(0 && "Unknown Dwarf Virtuality"); + return ""; +} + +/// LanguageString - Return the string for the specified language. +/// +static const char *LanguageString(unsigned Language) { + switch(Language) { + case DW_LANG_C89: return "LANG_C89"; + case DW_LANG_C: return "LANG_C"; + case DW_LANG_Ada83: return "LANG_Ada83"; + case DW_LANG_C_plus_plus: return "LANG_C_plus_plus"; + case DW_LANG_Cobol74: return "LANG_Cobol74"; + case DW_LANG_Cobol85: return "LANG_Cobol85"; + case DW_LANG_Fortran77: return "LANG_Fortran77"; + case DW_LANG_Fortran90: return "LANG_Fortran90"; + case DW_LANG_Pascal83: return "LANG_Pascal83"; + case DW_LANG_Modula2: return "LANG_Modula2"; + case DW_LANG_Java: return "LANG_Java"; + case DW_LANG_C99: return "LANG_C99"; + case DW_LANG_Ada95: return "LANG_Ada95"; + case DW_LANG_Fortran95: return "LANG_Fortran95"; + case DW_LANG_PLI: return "LANG_PLI"; + case DW_LANG_ObjC: return "LANG_ObjC"; + case DW_LANG_ObjC_plus_plus: return "LANG_ObjC_plus_plus"; + case DW_LANG_UPC: return "LANG_UPC"; + case DW_LANG_D: return "LANG_D"; + case DW_LANG_lo_user: return "LANG_lo_user"; + case DW_LANG_hi_user: return "LANG_hi_user"; + } + assert(0 && "Unknown Dwarf Language"); + return ""; +} + +/// CaseString - Return the string for the specified identifier case. +/// +static const char *CaseString(unsigned Case) { + switch(Case) { + case DW_ID_case_sensitive: return "ID_case_sensitive"; + case DW_ID_up_case: return "ID_up_case"; + case DW_ID_down_case: return "ID_down_case"; + case DW_ID_case_insensitive: return "ID_case_insensitive"; } + assert(0 && "Unknown Dwarf Identifier Case"); + return ""; +} + +/// ConventionString - Return the string for the specified calling convention. +/// +static const char *ConventionString(unsigned Convention) { + switch(Convention) { + case DW_CC_normal: return "CC_normal"; + case DW_CC_program: return "CC_program"; + case DW_CC_nocall: return "CC_nocall"; + case DW_CC_lo_user: return "CC_lo_user"; + case DW_CC_hi_user: return "CC_hi_user"; + } + assert(0 && "Unknown Dwarf Calling Convention"); + return ""; +} + +/// InlineCodeString - Return the string for the specified inline code. +/// +static const char *InlineCodeString(unsigned Code) { + switch(Code) { + case DW_INL_not_inlined: return "INL_not_inlined"; + case DW_INL_inlined: return "INL_inlined"; + case DW_INL_declared_not_inlined: return "INL_declared_not_inlined"; + case DW_INL_declared_inlined: return "INL_declared_inlined"; + } + assert(0 && "Unknown Dwarf Inline Code"); + return ""; +} + +/// ArrayOrderString - Return the string for the specified array order. +/// +static const char *ArrayOrderString(unsigned Order) { + switch(Order) { + case DW_ORD_row_major: return "ORD_row_major"; + case DW_ORD_col_major: return "ORD_col_major"; + } + assert(0 && "Unknown Dwarf Array Order"); + return ""; +} + +/// DiscriminantString - Return the string for the specified discriminant +/// descriptor. +static const char *DiscriminantString(unsigned Discriminant) { + switch(Discriminant) { + case DW_DSC_label: return "DSC_label"; + case DW_DSC_range: return "DSC_range"; + } + assert(0 && "Unknown Dwarf Discriminant Descriptor"); + return ""; +} + +/// LNStandardString - Return the string for the specified line number standard. +/// +static const char *LNStandardString(unsigned Standard) { + switch(Standard) { + case DW_LNS_copy: return "LNS_copy"; + case DW_LNS_advance_pc: return "LNS_advance_pc"; + case DW_LNS_advance_line: return "LNS_advance_line"; + case DW_LNS_set_file: return "LNS_set_file"; + case DW_LNS_set_column: return "LNS_set_column"; + case DW_LNS_negate_stmt: return "LNS_negate_stmt"; + case DW_LNS_set_basic_block: return "LNS_set_basic_block"; + case DW_LNS_const_add_pc: return "LNS_const_add_pc"; + case DW_LNS_fixed_advance_pc: return "LNS_fixed_advance_pc"; + case DW_LNS_set_prologue_end: return "LNS_set_prologue_end"; + case DW_LNS_set_epilogue_begin: return "LNS_set_epilogue_begin"; + case DW_LNS_set_isa: return "LNS_set_isa"; + } + assert(0 && "Unknown Dwarf Line Number Standard"); + return ""; +} + +/// LNExtendedString - Return the string for the specified line number extended +/// opcode encodings. +static const char *LNExtendedString(unsigned Encoding) { + switch(Encoding) { + // Line Number Extended Opcode Encodings + case DW_LNE_end_sequence: return "LNE_end_sequence"; + case DW_LNE_set_address: return "LNE_set_address"; + case DW_LNE_define_file: return "LNE_define_file"; + case DW_LNE_lo_user: return "LNE_lo_user"; + case DW_LNE_hi_user: return "LNE_hi_user"; + } + assert(0 && "Unknown Dwarf Line Number Extended Opcode Encoding"); + return ""; +} + +/// MacinfoString - Return the string for the specified macinfo type encodings. +/// +static const char *MacinfoString(unsigned Encoding) { + switch(Encoding) { + // Macinfo Type Encodings + case DW_MACINFO_define: return "MACINFO_define"; + case DW_MACINFO_undef: return "MACINFO_undef"; + case DW_MACINFO_start_file: return "MACINFO_start_file"; + case DW_MACINFO_end_file: return "MACINFO_end_file"; + case DW_MACINFO_vendor_ext: return "MACINFO_vendor_ext"; + } + assert(0 && "Unknown Dwarf Macinfo Type Encodings"); + return ""; +} + +/// CallFrameString - Return the string for the specified call frame instruction +/// encodings. +static const char *CallFrameString(unsigned Encoding) { + switch(Encoding) { + case DW_CFA_advance_loc: return "CFA_advance_loc"; + case DW_CFA_offset: return "CFA_offset"; + case DW_CFA_restore: return "CFA_restore"; + case DW_CFA_set_loc: return "CFA_set_loc"; + case DW_CFA_advance_loc1: return "CFA_advance_loc1"; + case DW_CFA_advance_loc2: return "CFA_advance_loc2"; + case DW_CFA_advance_loc4: return "CFA_advance_loc4"; + case DW_CFA_offset_extended: return "CFA_offset_extended"; + case DW_CFA_restore_extended: return "CFA_restore_extended"; + case DW_CFA_undefined: return "CFA_undefined"; + case DW_CFA_same_value: return "CFA_same_value"; + case DW_CFA_register: return "CFA_register"; + case DW_CFA_remember_state: return "CFA_remember_state"; + case DW_CFA_restore_state: return "CFA_restore_state"; + case DW_CFA_def_cfa: return "CFA_def_cfa"; + case DW_CFA_def_cfa_register: return "CFA_def_cfa_register"; + case DW_CFA_def_cfa_offset: return "CFA_def_cfa_offset"; + case DW_CFA_def_cfa_expression: return "CFA_def_cfa_expression"; + case DW_CFA_expression: return "CFA_expression"; + case DW_CFA_offset_extended_sf: return "CFA_offset_extended_sf"; + case DW_CFA_def_cfa_sf: return "CFA_def_cfa_sf"; + case DW_CFA_def_cfa_offset_sf: return "CFA_def_cfa_offset_sf"; + case DW_CFA_val_offset: return "CFA_val_offset"; + case DW_CFA_val_offset_sf: return "CFA_val_offset_sf"; + case DW_CFA_val_expression: return "CFA_val_expression"; + case DW_CFA_lo_user: return "CFA_lo_user"; + case DW_CFA_hi_user: return "CFA_hi_user"; + } + assert(0 && "Unknown Dwarf Call Frame Instruction Encodings"); + return ""; +} + +//===----------------------------------------------------------------------===// + +/// EmitValue - Emit integer of appropriate size. +/// +void DIEInteger::EmitValue(const DwarfWriter &DW, unsigned Form) const { + switch (Form) { + case DW_FORM_data1: DW.EmitByte(Value); break; + case DW_FORM_data2: DW.EmitShort(Value); break; + case DW_FORM_data4: DW.EmitLong(Value); break; + default: assert(0 && "DIE Value form not supported yet"); break; + } +} + +/// SizeOf - Determine size of integer value in bytes. +/// +unsigned DIEInteger::SizeOf(const DwarfWriter &DW, unsigned Form) const { + switch (Form) { + case DW_FORM_data1: return sizeof(int8_t); + case DW_FORM_data2: return sizeof(int16_t); + case DW_FORM_data4: return sizeof(int32_t); + default: assert(0 && "DIE Value form not supported yet"); break; + } + return 0; +} + +//===----------------------------------------------------------------------===// + +/// EmitValue - Emit string value. +/// +void DIEString::EmitValue(const DwarfWriter &DW, unsigned Form) const { + DW.EmitString(Value); +} + +/// SizeOf - Determine size of string value in bytes. +/// +unsigned DIEString::SizeOf(const DwarfWriter &DW, unsigned Form) const { + return Value.size() + sizeof(int8_t); +} + +//===----------------------------------------------------------------------===// + +/// EmitValue - Emit label value. +/// +void DIELabel::EmitValue(const DwarfWriter &DW, unsigned Form) const { + DW.EmitLabelReference(Value); +} + +/// SizeOf - Determine size of label value in bytes. +/// +unsigned DIELabel::SizeOf(const DwarfWriter &DW, unsigned Form) const { + return DW.getAddressSize(); +} + +//===----------------------------------------------------------------------===// + +/// EmitValue - Emit delta value. +/// +void DIEDelta::EmitValue(const DwarfWriter &DW, unsigned Form) const { + DW.EmitDifference(Value1, Value2); +} + +/// SizeOf - Determine size of delta value in bytes. +/// +unsigned DIEDelta::SizeOf(const DwarfWriter &DW, unsigned Form) const { + return DW.getAddressSize(); +} + +//===----------------------------------------------------------------------===// + +/// PrintHex - Print a value as a hexidecimal value. +/// +void DwarfWriter::PrintHex(int Value) const { + O << "0x" << std::hex << Value << std::dec; +} + +/// EOL - Print a newline character to asm stream. If a comment is present +/// then it will be printed first. Comments should not contain '\n'. +void DwarfWriter::EOL(const std::string &Comment) const { if (DwarfVerbose) { O << "\t" << Asm->CommentString << " " - << Comment - << " " - << Value; + << Comment; } O << "\n"; } -/// EmitHex - Emit a hexidecimal string to the output stream. -/// -void DwarfWriter::EmitHex(unsigned Value) const { - O << "0x" - << std::hex - << Value - << std::dec; +/// EmitULEB128Bytes - Emit an assembler byte data directive to compose an +/// unsigned leb128 value. +void DwarfWriter::EmitULEB128Bytes(unsigned Value) const { + if (hasLEB128) { + O << "\t.uleb128\t" + << Value; + } else { + O << Asm->Data8bitsDirective; + PrintULEB128(Value); + } } -/// EmitComment - Emit a simple string comment. -/// -void DwarfWriter::EmitComment(const char *Comment) const { - O << "\t" - << Asm->CommentString - << " " - << Comment - << "\n"; +/// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a +/// signed leb128 value. +void DwarfWriter::EmitSLEB128Bytes(int Value) const { + if (hasLEB128) { + O << "\t.sleb128\t" + << Value; + } else { + O << Asm->Data8bitsDirective; + PrintSLEB128(Value); + } } -/// EmitULEB128 - Emit a series of hexidecimal values (separated by commas) +/// PrintULEB128 - Print a series of hexidecimal values (separated by commas) /// representing an unsigned leb128 value. -/// -void DwarfWriter::EmitULEB128(unsigned Value) const { +void DwarfWriter::PrintULEB128(unsigned Value) const { do { unsigned Byte = Value & 0x7f; Value >>= 7; if (Value) Byte |= 0x80; - EmitHex(Byte); + PrintHex(Byte); if (Value) O << ", "; } while (Value); } -/// EmitSLEB128 - Emit a series of hexidecimal values (separated by commas) +/// SizeULEB128 - Compute the number of bytes required for an unsigned leb128 +/// value. +unsigned DwarfWriter::SizeULEB128(unsigned Value) { + unsigned Size = 0; + do { + Value >>= 7; + Size += sizeof(int8_t); + } while (Value); + return Size; +} + +/// PrintSLEB128 - Print a series of hexidecimal values (separated by commas) /// representing a signed leb128 value. -/// -void DwarfWriter::EmitSLEB128(int Value) const { +void DwarfWriter::PrintSLEB128(int Value) const { int Sign = Value >> (8 * sizeof(Value) - 1); bool IsMore; @@ -115,40 +802,499 @@ Value >>= 7; IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; if (IsMore) Byte |= 0x80; - EmitHex(Byte); + PrintHex(Byte); if (IsMore) O << ", "; } while (IsMore); } -/// EmitLabelName - Emit label name for internal use by dwarf. +/// SizeSLEB128 - Compute the number of bytes required for a signed leb128 +/// value. +unsigned DwarfWriter::SizeSLEB128(int Value) { + unsigned Size = 0; + int Sign = Value >> (8 * sizeof(Value) - 1); + bool IsMore; + + do { + unsigned Byte = Value & 0x7f; + Value >>= 7; + IsMore = Value != Sign || ((Byte ^ Sign) & 0x40) != 0; + Size += sizeof(int8_t); + } while (IsMore); + return Size; +} + +/// EmitByte - Emit a byte directive and value. +/// +void DwarfWriter::EmitByte(int Value) const { + O << Asm->Data8bitsDirective; + PrintHex(Value); +} + +/// EmitShort - Emit a short directive and value. /// -void DwarfWriter::EmitLabelName(const char *Tag, int Num) const { +void DwarfWriter::EmitShort(int Value) const { + O << Asm->Data16bitsDirective; + PrintHex(Value); +} + +/// EmitLong - Emit a long directive and value. +/// +void DwarfWriter::EmitLong(int Value) const { + O << Asm->Data32bitsDirective; + PrintHex(Value); +} + +/// EmitString - Emit a string with quotes and a null terminator. +/// Special characters are emitted properly. (Eg. '\t') +void DwarfWriter::EmitString(const std::string &String) const { + O << Asm->AsciiDirective + << "\""; + for (unsigned i = 0, N = String.size(); i < N; i++) { + unsigned char C = String[i]; + + if (!isascii(C) || iscntrl(C)) { + switch(C) { + case '\b': O << "\\b"; break; + case '\f': O << "\\f"; break; + case '\n': O << "\\n"; break; + case '\r': O << "\\r"; break; + case '\t': O << "\\t"; break; + default: + O << '\\'; + O << char('0' + (C >> 6)); + O << char('0' + (C >> 3)); + O << char('0' + (C >> 0)); + break; + } + } else if (C == '\"') { + O << "\\\""; + } else if (C == '\'') { + O << "\\\'"; + } else { + O << C; + } + } + O << "\\0\""; +} + +/// PrintLabelName - Print label name in form used by Dwarf writer. +/// +void DwarfWriter::PrintLabelName(const char *Tag, unsigned Number) const { O << Asm->PrivateGlobalPrefix << "debug_" << Tag - << Num; + << Number; } -/// EmitLabel - Emit location label for internal use by dwarf. +/// EmitLabel - Emit location label for internal use by Dwarf. /// -void DwarfWriter::EmitLabel(const char *Tag, int Num) const { - EmitLabelName(Tag, Num); +void DwarfWriter::EmitLabel(const char *Tag, unsigned Number) const { + PrintLabelName(Tag, Number); O << ":\n"; } -/// EmitInitial -Emit initial dwarf declarations. +/// EmitLabelReference - Emit a reference to a label. +/// +void DwarfWriter::EmitLabelReference(const char *Tag, unsigned Number) const { + if (AddressSize == 4) + O << Asm->Data32bitsDirective; + else + O << Asm->Data64bitsDirective; + + PrintLabelName(Tag, Number); +} + +/// EmitDifference - Emit an label difference as sizeof(pointer) value. Some +/// assemblers do not accept absolute expressions with data directives, so there +/// is an option (needsSet) to use an intermediary 'set' expression. +void DwarfWriter::EmitDifference(const char *Tag1, unsigned Number1, + const char *Tag2, unsigned Number2) const { + if (needsSet) { + static unsigned SetCounter = 0; + O << "\t.set\t"; + PrintLabelName("set", SetCounter); + O << ","; + PrintLabelName(Tag1, Number1); + O << "-"; + PrintLabelName(Tag2, Number2); + O << "\n"; + + if (AddressSize == sizeof(int32_t)) + O << Asm->Data32bitsDirective; + else + O << Asm->Data64bitsDirective; + + PrintLabelName("set", SetCounter); + + SetCounter++; + } else { + if (AddressSize == sizeof(int32_t)) + O << Asm->Data32bitsDirective; + else + O << Asm->Data64bitsDirective; + + PrintLabelName(Tag1, Number1); + O << "-"; + PrintLabelName(Tag2, Number2); + } +} + +/// NewDIE - Construct a new structured debug information entry. +/// +DIE *DwarfWriter::NewDIE(const unsigned char *AbbrevData) { + // Get the abbreviation ID. + unsigned AbbrevID = Abbreviations.insert(DIEAbbrev(AbbrevData)); + // Allocate new new structured DIE. + DIE *Die = new DIE(AbbrevID); + // Return structured DIE. + return Die; +} + +/// NewCompileUnit - Create new compile unit information. +/// +DIE *DwarfWriter::NewCompileUnit(const std::string &Directory, + const std::string &SourceName) { + DIE *Die = NewDIE(AbbrevTAG_compile_unit); + // FIXME - use the correct line set. + Die->AddValue(DWLabel("line", 0)); + Die->AddValue(DWLabel("text_end", 0)); + Die->AddValue(DWLabel("text_begin", 0)); + // FIXME - The producer needs to be in this form, but should come from + // an appropriate source. + Die->AddValue("llvm 3.4.x (LLVM Research Group)"); + Die->AddValue(DW_LANG_C89); + Die->AddValue(SourceName); + Die->AddValue(Directory); + + return Die; +} + +/// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc +/// tools to recognize the object file contains Dwarf information. /// void DwarfWriter::EmitInitial() const { - // Dwarf section's base addresses. + // Dwarf sections base addresses. Asm->SwitchSection(DwarfAbbrevSection, 0); EmitLabel("abbrev", 0); Asm->SwitchSection(DwarfInfoSection, 0); EmitLabel("info", 0); Asm->SwitchSection(DwarfLineSection, 0); EmitLabel("line", 0); + + // Standard sections base addresses. + Asm->SwitchSection(TextSection, 0); + EmitLabel("text_begin", 0); + Asm->SwitchSection(DataSection, 0); + EmitLabel("data_begin", 0); +} + +/// EmitDIE - Recusively Emits a debug information entry. +/// +void DwarfWriter::EmitDIE(DIE *Die) const { + // Get the abbreviation for this DIE. + unsigned AbbrevID = Die->getAbbrevID(); + const DIEAbbrev &Abbrev = Abbreviations[AbbrevID]; + + // Emit the code (index) for the abbreviation. + EmitULEB128Bytes(AbbrevID); + EOL(std::string("Abbrev [" + + utostr(AbbrevID) + + TagString(Abbrev.getTag())) + + " "); + + const std::vector &Values = Die->getValues(); + + // Emit the DIE attribute values. + for (unsigned i = 0, N = Values.size(); i < N; i++) { + unsigned Attr = Abbrev.getAttribute(i); + unsigned Form = Abbrev.getForm(i); + assert(Form && "Too many attributes for DIE (check abbreviation)"); + + switch (Attr) { + case DW_AT_sibling: { + EmitLong(Die->SiblingOffset()); + break; + } + default: { + // Emit an attribute using the defined form. + Values[i]->EmitValue(*this, Form); + break; + } + } + + EOL(AttributeString(Attr)); + } + + // Emit the DIE children if any. + if (Abbrev.getChildrenFlag() == DW_CHILDREN_yes) { + const std::vector &Children = Die->getChildren(); + + for (unsigned j = 0, M = Children.size(); j < M; j++) { + // FIXME - handle sibling offsets. + // FIXME - handle all DIE types. + EmitDIE(Children[j]); + } + + EmitByte(0); EOL("End Of Children Mark"); + } +} + +/// SizeAndOffsetDie - Compute the size and offset of a DIE. +/// +unsigned DwarfWriter::SizeAndOffsetDie(DIE *Die, unsigned Offset) const { + // Get the abbreviation for this DIE. + unsigned AbbrevID = Die->getAbbrevID(); + const DIEAbbrev &Abbrev = Abbreviations[AbbrevID]; + + // Set DIE offset + Die->setOffset(Offset); + + // Start the size with the size of abbreviation code. + Offset += SizeULEB128(AbbrevID); + + const std::vector &Values = Die->getValues(); + + // Emit the DIE attribute values. + for (unsigned i = 0, N = Values.size(); i < N; i++) { + // Size attribute value. + Offset += Values[i]->SizeOf(*this, Abbrev.getForm(i)); + } + + // Emit the DIE children if any. + if (Abbrev.getChildrenFlag() == DW_CHILDREN_yes) { + const std::vector &Children = Die->getChildren(); + + for (unsigned j = 0, M = Children.size(); j < M; j++) { + // FIXME - handle sibling offsets. + // FIXME - handle all DIE types. + Offset = SizeAndOffsetDie(Children[j], Offset); + } + + // End of children marker. + Offset += sizeof(int8_t); + } + + Die->setSize(Offset - Die->getOffset()); + return Offset; +} + +/// SizeAndOffsets - Compute the size and offset of all the DIEs. +/// +void DwarfWriter::SizeAndOffsets() { + // Compute size of debug unit header + unsigned Offset = sizeof(int32_t) + // Length of Compilation Unit Info + sizeof(int16_t) + // DWARF version number + sizeof(int32_t) + // Offset Into Abbrev. Section + sizeof(int8_t); // Pointer Size (in bytes) + + // Process each compile unit. + for (unsigned i = 0, N = CompileUnits.size(); i < N; i++) { + Offset = SizeAndOffsetDie(CompileUnits[i], Offset); + } +} + +/// EmitDebugInfo - Emit the debug info section. +/// +void DwarfWriter::EmitDebugInfo() const { + // Start debug info section. + Asm->SwitchSection(DwarfInfoSection, 0); + + // Get the number of compile units. + unsigned N = CompileUnits.size(); + + // If there are any compile units. + if (N) { + // Emit the compile units header. + + // Emit size of content not including length itself + unsigned ContentSize = CompileUnits[N - 1]->SiblingOffset(); + EmitLong(ContentSize - sizeof(int32_t)); + EOL("Length of Compilation Unit Info"); + + EmitShort(DWARF_VERSION); EOL("DWARF version number"); + + EmitLabelReference("abbrev", 0); EOL("Offset Into Abbrev. Section"); + + EmitByte(AddressSize); EOL("Address Size (in bytes)"); + + // Process each compile unit. + for (unsigned i = 0; i < N; i++) { + EmitDIE(CompileUnits[i]); + } + } +} + +/// EmitAbbreviations - Emit the abbreviation section. +/// +void DwarfWriter::EmitAbbreviations() const { + // Start the debug abbrev section. + Asm->SwitchSection(DwarfAbbrevSection, 0); + + // For each abbrevation. + for (unsigned AbbrevID = 1, NAID = Abbreviations.size(); + AbbrevID <= NAID; AbbrevID++) { + // Get abbreviation data + const DIEAbbrev &Abbrev = Abbreviations[AbbrevID]; + + // Emit the abbrevations code (base 1 index.) + EmitULEB128Bytes(AbbrevID); EOL("Abbreviation Code"); + + // Emit its Dwarf tag type. + EmitULEB128Bytes(Abbrev.getTag()); + EOL(TagString(Abbrev.getTag())); + + // Emit whether it has children DIEs. + EmitULEB128Bytes(Abbrev.getChildrenFlag()); + EOL(ChildrenString(Abbrev.getChildrenFlag())); + + // For each attribute description. + for (unsigned i = 0; ; i++) { + unsigned Attr = Abbrev.getAttribute(i); + unsigned Form = Abbrev.getForm(i); + + // Attributes are null terminated. + if (!Attr) break; + + // Emit attribute type. + EmitULEB128Bytes(Attr); + EOL(AttributeString(Attr)); + + // Emit form type. + EmitULEB128Bytes(Form); + EOL(FormEncodingString(Form)); + } + + // Mark end of abbreviation. + EmitULEB128Bytes(0); EOL("EOM(1)"); + EmitULEB128Bytes(0); EOL("EOM(2)"); + } +} + +/// EmitDebugLines - Emit source line information. +/// +void DwarfWriter::EmitDebugLines() const { + // Minimum line delta, thus ranging from -10..(255-10). + const int MinLineDelta = -(DW_LNS_fixed_advance_pc + 1); + // Maximum line delta, thus ranging from -10..(255-10). + const int MaxLineDelta = 255 + MinLineDelta; + + // Start the dwarf line section. + Asm->SwitchSection(DwarfLineSection, 0); + + // Construct the section header. + + EmitDifference("line_end", 0, "line_begin", 0); + EOL("Length of Source Line Info"); + EmitLabel("line_begin", 0); + + EmitShort(DWARF_VERSION); EOL("DWARF version number"); + + EmitDifference("line_prolog_end", 0, "line_prolog_begin", 0); + EOL("Prolog Length"); + EmitLabel("line_prolog_begin", 0); + + EmitByte(1); EOL("Minimum Instruction Length"); + + EmitByte(1); EOL("Default is_stmt_start flag"); + + EmitByte(MinLineDelta); EOL("Line Base Value (Special Opcodes)"); + + EmitByte(MaxLineDelta); EOL("Line Range Value (Special Opcodes)"); + + EmitByte(-MinLineDelta); EOL("Special Opcode Base"); + + // Line number standard opcode encodings argument count + EmitByte(0); EOL("DW_LNS_copy arg count"); + EmitByte(1); EOL("DW_LNS_advance_pc arg count"); + EmitByte(1); EOL("DW_LNS_advance_line arg count"); + EmitByte(1); EOL("DW_LNS_set_file arg count"); + EmitByte(1); EOL("DW_LNS_set_column arg count"); + EmitByte(0); EOL("DW_LNS_negate_stmt arg count"); + EmitByte(0); EOL("DW_LNS_set_basic_block arg count"); + EmitByte(0); EOL("DW_LNS_const_add_pc arg count"); + EmitByte(1); EOL("DW_LNS_fixed_advance_pc arg count"); + + const UniqueVector &Directories = DebugInfo->getDirectories(); + const UniqueVector &SourceFiles = DebugInfo->getSourceFiles(); + + // Emit directories. + for (unsigned DirectoryID = 1, NDID = Directories.size(); + DirectoryID <= NDID; DirectoryID++) { + EmitString(Directories[DirectoryID]); EOL("Directory"); + } + EmitByte(0); EOL("End of directories"); + + // Emit files. + for (unsigned SourceID = 1, NSID = SourceFiles.size(); + SourceID <= NSID; SourceID++) { + const SourceFileInfo &SourceFile = SourceFiles[SourceID]; + EmitString(SourceFile.getName()); EOL("Source"); + EmitULEB128Bytes(SourceFile.getDirectoryID()); EOL("Directory #"); + EmitULEB128Bytes(0); EOL("Mod date"); + EmitULEB128Bytes(0); EOL("File size"); + } + EmitByte(0); EOL("End of files"); + + EmitLabel("line_prolog_end", 0); + + // Emit line information + const std::vector &LineInfos = DebugInfo->getSourceLines(); + + // Dwarf assumes we start with first line of first source file. + unsigned Source = 1; + unsigned Line = 1; + + // Construct rows of the address, source, line, column matrix. + for (unsigned i = 0, N = LineInfos.size(); i < N; i++) { + SourceLineInfo *LineInfo = LineInfos[i]; + + // Define the line address. + EmitByte(0); EOL("Extended Op"); + EmitByte(4 + 1); EOL("Op size"); + EmitByte(DW_LNE_set_address); EOL("DW_LNE_set_address"); + EmitLabelReference("loc", i + 1); EOL("Location label"); + + // If change of source, then switch to the new source. + if (Source != LineInfo->getSourceID()) { + Source = LineInfo->getSourceID(); + EmitByte(DW_LNS_set_file); EOL("DW_LNS_set_file"); + EmitULEB128Bytes(0); EOL("New Source"); + } + + // If change of line. + if (Line != LineInfo->getLine()) { + // Determine offset. + int Offset = LineInfo->getLine() - Line; + int Delta = Offset - MinLineDelta; + + // Update line. + Line = LineInfo->getLine(); + + // If delta is small enough and in range... + if (Delta >= 0 && Delta < (MaxLineDelta - 1)) { + // ... then use fast opcode. + EmitByte(Delta - MinLineDelta); EOL("Line Delta"); + } else { + // ... otherwise use long hand. + EmitByte(DW_LNS_advance_line); EOL("DW_LNS_advance_line"); + EmitSLEB128Bytes(Offset); EOL("Line Offset"); + EmitByte(DW_LNS_copy); EOL("DW_LNS_copy"); + } + } else { + // Copy the previous row (different address or source) + EmitByte(DW_LNS_copy); EOL("DW_LNS_copy"); + } + } + + // Mark end of matrix. + EmitByte(0); EOL("DW_LNE_end_sequence"); + EmitULEB128Bytes(1); O << "\n"; + EmitByte(1); O << "\n"; + + EmitLabel("line_end", 0); } -/// ShouldEmitDwarf - Determine if dwarf declarations should be made. +/// ShouldEmitDwarf - Determine if Dwarf declarations should be made. /// bool DwarfWriter::ShouldEmitDwarf() { // Check if debug info is present. @@ -164,35 +1310,85 @@ return true; } -/// BeginModule - Emit all dwarf sections that should come prior to the content. +//===----------------------------------------------------------------------===// +// Main enties. +// + + DwarfWriter::DwarfWriter(std::ostream &o, AsmPrinter *ap) + : O(o) + , Asm(ap) + , DebugInfo(NULL) + , didInitial(false) + , CompileUnits() + , Abbreviations() + , AddressSize(sizeof(int32_t)) + , hasLEB128(false) + , hasDotLoc(false) + , hasDotFile(false) + , needsSet(false) + , DwarfAbbrevSection(".debug_abbrev") + , DwarfInfoSection(".debug_info") + , DwarfLineSection(".debug_line") + , TextSection(".text") + , DataSection(".data") + {} + DwarfWriter::~DwarfWriter() { + } + +/// BeginModule - Emit all Dwarf sections that should come prior to the content. /// void DwarfWriter::BeginModule() { if (!ShouldEmitDwarf()) return; - EmitComment("Dwarf Begin Module"); + EOL("Dwarf Begin Module"); } -/// EndModule - Emit all dwarf sections that should come after the content. +/// EndModule - Emit all Dwarf sections that should come after the content. /// void DwarfWriter::EndModule() { if (!ShouldEmitDwarf()) return; - EmitComment("Dwarf End Module"); - // Print out dwarf file info - std::vector Sources = DebugInfo->getSourceFiles(); - for (unsigned i = 0, N = Sources.size(); i < N; i++) { - O << "\t; .file\t" << (i + 1) << "," << "\"" << Sources[i] << "\"" << "\n"; + EOL("Dwarf End Module"); + + // Standard sections final addresses. + EmitLabel("text_end", 0); + EmitLabel("data_end", 0); + + // Get directory and source information. + const UniqueVector &Directories = DebugInfo->getDirectories(); + const UniqueVector &SourceFiles = DebugInfo->getSourceFiles(); + + // Construct compile unit DIEs for each source. + for (unsigned SourceID = 1, NSID = SourceFiles.size(); + SourceID <= NSID; SourceID++) { + const SourceFileInfo &SourceFile = SourceFiles[SourceID]; + const std::string &Directory = Directories[SourceFile.getDirectoryID()]; + const std::string &SourceName = SourceFile.getName(); + DIE *CompileUnit = NewCompileUnit(Directory, SourceName); + CompileUnits.push_back(CompileUnit); } + + // Compute DIE offsets and sizes. + SizeAndOffsets(); + + // Emit all the DIEs into a debug info section + EmitDebugInfo(); + + // Corresponding abbreviations into a abbrev section. + EmitAbbreviations(); + + // Emit source line correspondence into a debug line section. + EmitDebugLines(); } /// BeginFunction - Emit pre-function debug information. /// void DwarfWriter::BeginFunction() { if (!ShouldEmitDwarf()) return; - EmitComment("Dwarf Begin Function"); + EOL("Dwarf Begin Function"); } /// EndFunction - Emit post-function debug information. /// void DwarfWriter::EndFunction() { if (!ShouldEmitDwarf()) return; - EmitComment("Dwarf End Function"); + EOL("Dwarf End Function"); } Index: llvm/lib/CodeGen/MachineDebugInfo.cpp diff -u llvm/lib/CodeGen/MachineDebugInfo.cpp:1.3 llvm/lib/CodeGen/MachineDebugInfo.cpp:1.4 --- llvm/lib/CodeGen/MachineDebugInfo.cpp:1.3 Wed Jan 4 16:28:25 2006 +++ llvm/lib/CodeGen/MachineDebugInfo.cpp Tue Jan 17 11:31:53 2006 @@ -6,11 +6,6 @@ // the University of Illinois Open Source License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -// -// Collect debug information for a module. This information should be in a -// neutral form that can be used by different debugging schemes. -// -//===----------------------------------------------------------------------===// #include "llvm/CodeGen/MachineDebugInfo.h" @@ -20,7 +15,9 @@ namespace { RegisterPass X("machinedebuginfo", "Debug Information"); } + +//===----------------------------------------------------------------------===// /// doInitialization - Initialize the debug state for a new module. /// bool MachineDebugInfo::doInitialization() { @@ -32,38 +29,3 @@ bool MachineDebugInfo::doFinalization() { return false; } - -/// getUniqueSourceID - Register a source file with debug info. Returns an id. -/// -unsigned MachineDebugInfo::getUniqueSourceID(const std::string &fname, - const std::string &dirname) { - // Compose a key - const std::string path = dirname + "/" + fname; - // Check if the source file is already recorded - std::map::iterator - SMI = SourceMap.lower_bound(path); - // If already there return existing id - if (SMI != SourceMap.end() && SMI->first == path) return SMI->second; - // Bump up the count - ++SourceCount; - // Record the count - SourceMap.insert(SMI, std::make_pair(path, SourceCount)); - // Return id - return SourceCount; -} - -/// getSourceFiles - Return a vector of files. Vector index + 1 equals id. -/// -std::vector MachineDebugInfo::getSourceFiles() const { - std::vector Sources(SourceCount); - - for (std::map::const_iterator SMI = SourceMap.begin(), - E = SourceMap.end(); - SMI != E; SMI++) { - unsigned Index = SMI->second - 1; - const std::string &Path = SMI->first; - Sources[Index] = Path; - } - return Sources; -} - From jlaskey at apple.com Tue Jan 17 11:32:07 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 11:32:07 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h MachineDebugInfo.h Message-ID: <200601171732.LAA05807@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.6 -> 1.7 MachineDebugInfo.h updated: 1.5 -> 1.6 --- Log message: Adding basic support for Dwarf line number debug information. I promise to keep future commits smaller. --- Diffs of the changes: (+506 -84) DwarfWriter.h | 446 ++++++++++++++++++++++++++++++++++++++++++++++------- MachineDebugInfo.h | 144 +++++++++++++---- 2 files changed, 506 insertions(+), 84 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.6 llvm/include/llvm/CodeGen/DwarfWriter.h:1.7 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.6 Wed Jan 4 19:25:28 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Tue Jan 17 11:31:53 2006 @@ -7,14 +7,26 @@ // //===----------------------------------------------------------------------===// // -// This file contains support for writing dwarf debug info into asm files. +// This file contains support for writing Dwarf debug info into asm files. For +// Details on the Dwarf 3 specfication see DWARF Debugging Information Format +// V.3 reference manual http://dwarf.freestandards.org , // +// The role of the Dwarf Writer class is to extract debug information from the +// MachineDebugInfo object, organize it in Dwarf form and then emit it into asm +// the current asm file using data and high level Dwarf directives. +// //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_DWARFPRINTER_H #define LLVM_CODEGEN_DWARFPRINTER_H +#include "llvm/ADT/UniqueVector.h" + #include +#include +#include +#include + namespace llvm { @@ -23,6 +35,8 @@ // reference manual http://dwarf.freestandards.org . // enum dwarf_constants { + DWARF_VERSION = 2, + // Tags DW_TAG_array_type = 0x01, DW_TAG_class_type = 0x02, @@ -425,23 +439,246 @@ DW_CFA_hi_user = 0x3f }; + //===--------------------------------------------------------------------===// + // DWLabel - Labels are used to track locations in the assembler file. + // Labels appear in the form debug_, where the tag is a + // category of label (Ex. location) and number is a value unique in that + // category. + struct DWLabel { + const char *Tag; // Label category tag. Should always be + // a staticly declared C string. + unsigned Number; // Unique number + + DWLabel() : Tag(NULL), Number(0) {} + DWLabel(const char *T, unsigned N) : Tag(T), Number(N) {} + }; + + //===--------------------------------------------------------------------===// + // DIEAbbrev - Dwarf abbreviation, describes the organization of a debug + // information object. + // + class DIEAbbrev { + private: + const unsigned char *Data; // Static array of bytes containing the + // image of the raw abbreviation data. + + public: + + DIEAbbrev(const unsigned char *D) + : Data(D) + {} + + /// operator== - Used by UniqueVector to locate entry. + /// + bool operator==(const DIEAbbrev &DA) const { + return Data == DA.Data; + } + + /// operator< - Used by UniqueVector to locate entry. + /// + bool operator<(const DIEAbbrev &DA) const { + return Data < DA.Data; + } + + // Accessors + unsigned getTag() const { return Data[0]; } + unsigned getChildrenFlag() const { return Data[1]; } + unsigned getAttribute(unsigned i) const { return Data[2 + 2 * i + 0]; } + unsigned getForm(unsigned i) const { return Data[2 + 2 * i + 1]; } + }; + + //===--------------------------------------------------------------------===// + // DIEValue - A debug information entry value. + // + class DwarfWriter; + class DIEValue { + public: + enum { + isInteger, + isString, + isLabel, + isDelta + }; + + unsigned Type; // Type of the value + + DIEValue(unsigned T) : Type(T) {} + virtual ~DIEValue() {} + + // Implement isa/cast/dyncast. + static bool classof(const DIEValue *) { return true; } + + /// EmitValue - Emit value via the Dwarf writer. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const = 0; + + /// SizeOf - Return the size of a value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const = 0; + }; + + //===--------------------------------------------------------------------===// + // DWInteger - An integer value DIE. + // + class DIEInteger : public DIEValue { + private: + int Value; + + public: + DIEInteger(int V) : DIEValue(isInteger), Value(V) {} + + // Implement isa/cast/dyncast. + static bool classof(const DIEInteger *) { return true; } + static bool classof(const DIEValue *V) { return V->Type == isInteger; } + + /// EmitValue - Emit integer of appropriate size. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const; + + /// SizeOf - Determine size of integer value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const; + }; + + //===--------------------------------------------------------------------===// + // DIEString - A string value DIE. + // + struct DIEString : public DIEValue { + const std::string Value; + + DIEString(const std::string &V) : DIEValue(isString), Value(V) {} + + // Implement isa/cast/dyncast. + static bool classof(const DIEString *) { return true; } + static bool classof(const DIEValue *V) { return V->Type == isString; } + + /// EmitValue - Emit string value. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const; + + /// SizeOf - Determine size of string value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const; + }; + + //===--------------------------------------------------------------------===// + // DIELabel - A simple label expression DIE. + // + struct DIELabel : public DIEValue { + const DWLabel Value; + + DIELabel(const DWLabel &V) : DIEValue(DW_FORM_ref4), Value(V) {} + + // Implement isa/cast/dyncast. + static bool classof(const DWLabel *) { return true; } + static bool classof(const DIEValue *V) { return V->Type == isLabel; } + + /// EmitValue - Emit label value. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const; + + /// SizeOf - Determine size of label value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const; + }; + + //===--------------------------------------------------------------------===// + // DIEDelta - A simple label difference DIE. + // + struct DIEDelta : public DIEValue { + const DWLabel Value1; + const DWLabel Value2; + + DIEDelta(const DWLabel &V1, const DWLabel &V2) + : DIEValue(DW_FORM_addr), Value1(V1), Value2(V2) {} + + // Implement isa/cast/dyncast. + static bool classof(const DIEDelta *) { return true; } + static bool classof(const DIEValue *V) { return V->Type == isDelta; } + + /// EmitValue - Emit delta value. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const; + + /// SizeOf - Determine size of delta value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const; + }; + + //===--------------------------------------------------------------------===// + // DIE - A structured debug information entry. Has an abbreviation which + // describes it's organization. + class DIE { + private: + unsigned AbbrevID; // Decribing abbreviation ID. + unsigned Offset; // Offset in debug info section + unsigned Size; // Size of instance + children + std::vector Children; // Children DIEs + std::vector Values; // Attributes values + + public: + DIE(unsigned AbbrevID) + : AbbrevID(AbbrevID) + , Offset(0) + , Size(0) + , Children() + , Values() + {} + virtual ~DIE() { + } + + // Accessors + unsigned getAbbrevID() const { return AbbrevID; } + unsigned getOffset() const { return Offset; } + unsigned getSize() const { return Size; } + const std::vector &getChildren() const { return Children; } + const std::vector &getValues() const { return Values; } + void setOffset(unsigned O) { Offset = O; } + void setSize(unsigned S) { Size = S; } + + /// AddValue - Add an attribute value of appropriate type. + /// + void AddValue(int Value) { + Values.push_back(new DIEInteger(Value)); + } + void AddValue(const std::string &Value) { + Values.push_back(new DIEString(Value)); + } + void AddValue(const DWLabel &Value) { + Values.push_back(new DIELabel(Value)); + } + void AddValue(const DWLabel &Value1, const DWLabel &Value2) { + Values.push_back(new DIEDelta(Value1, Value2)); + } + + /// SiblingOffset - Return the offset of the debug information entry's + /// sibling. + unsigned SiblingOffset() const { return Offset + Size; } + }; + + //===--------------------------------------------------------------------===// // Forward declarations. // class AsmPrinter; class MachineDebugInfo; //===--------------------------------------------------------------------===// - // DwarfWriter - emits dwarf debug and exception handling directives. + // DwarfWriter - emits Dwarf debug and exception handling directives. // class DwarfWriter { protected: + //===------------------------------------------------------------------===// + // Core attributes used by the Dwarf writer. + // + + // /// O - Stream to .s file. /// std::ostream &O; - /// Asm - Target of dwarf emission. + /// Asm - Target of Dwarf emission. /// AsmPrinter *Asm; @@ -454,8 +691,25 @@ bool didInitial; //===------------------------------------------------------------------===// + // Attributes used to construct specific Dwarf sections. + // + + /// CompileUnits - All the compile units involved in this build. The index + /// of each entry in this vector corresponds to the sources in DebugInfo. + std::vector CompileUnits; + + /// Abbreviations - A UniqueVector of TAG structure abbreviations. + /// + UniqueVector Abbreviations; + + //===------------------------------------------------------------------===// // Properties to be set by the derived class ctor, used to configure the - // dwarf writer. + // Dwarf writer. + // + + /// AddressSize - Size of addresses used in file. + /// + unsigned AddressSize; /// hasLEB128 - True if target asm supports leb128 directives. /// @@ -473,93 +727,174 @@ /// directives. bool needsSet; /// Defaults to false. - /// DwarfAbbrevSection - section directive arg for dwarf abbrev. + /// DwarfAbbrevSection - Section directive for Dwarf abbrev. /// const char *DwarfAbbrevSection; /// Defaults to ".debug_abbrev". - /// DwarfInfoSection - section directive arg for dwarf info. + /// DwarfInfoSection - Section directive for Dwarf info. /// const char *DwarfInfoSection; /// Defaults to ".debug_info". - /// DwarfLineSection - section directive arg for dwarf info. + /// DwarfLineSection - Section directive for Dwarf info. /// const char *DwarfLineSection; /// Defaults to ".debug_line". + + /// TextSection - Section directive for standard text. + /// + const char *TextSection; /// Defaults to ".text". + + /// DataSection - Section directive for standard data. + /// + const char *DataSection; /// Defaults to ".data". //===------------------------------------------------------------------===// + // Emission and print routines + // - public: +public: + /// getAddressSize - Return the size of a target address in bytes. + /// + unsigned getAddressSize() const { return AddressSize; } + + /// PrintHex - Print a value as a hexidecimal value. + /// + void PrintHex(int Value) const; + + /// EOL - Print a newline character to asm stream. If a comment is present + /// then it will be printed first. Comments should not contain '\n'. + void EOL(const std::string &Comment) const; + + /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an + /// unsigned leb128 value. + void EmitULEB128Bytes(unsigned Value) const; - // Ctor. - DwarfWriter(std::ostream &o, AsmPrinter *ap) - : O(o) - , Asm(ap) - , DebugInfo(NULL) - , didInitial(false) - , hasLEB128(false) - , hasDotLoc(false) - , hasDotFile(false) - , needsSet(false) - , DwarfAbbrevSection(".debug_abbrev") - , DwarfInfoSection(".debug_info") - , DwarfLineSection(".debug_line") - {} + /// EmitSLEB128Bytes - print an assembler byte data directive to compose a + /// signed leb128 value. + void EmitSLEB128Bytes(int Value) const; - /// SetDebugInfo - Set DebugInfo at when it's know that pass manager - /// has created it. - void SetDebugInfo(MachineDebugInfo *di) { DebugInfo = di; } + /// PrintULEB128 - Print a series of hexidecimal values (separated by + /// commas) representing an unsigned leb128 value. + void PrintULEB128(unsigned Value) const; + + /// SizeULEB128 - Compute the number of bytes required for an unsigned + /// leb128 value. + static unsigned SizeULEB128(unsigned Value); - /// EmitHex - Emit a hexidecimal string to the output stream. - /// - void EmitHex(unsigned Value) const; + /// PrintSLEB128 - Print a series of hexidecimal values (separated by + /// commas) representing a signed leb128 value. + void PrintSLEB128(int Value) const; + + /// SizeSLEB128 - Compute the number of bytes required for a signed leb128 + /// value. + static unsigned SizeSLEB128(int Value); - /// EmitComment - Emit a simple string comment. + /// EmitByte - Emit a byte directive and value. /// - void EmitComment(const char *Comment) const; + void EmitByte(int Value) const; - /// EmitULEB128 - Emit a series of hexidecimal values (separated by commas) - /// representing an unsigned leb128 value. + /// EmitShort - Emit a short directive and value. /// - void EmitULEB128(unsigned Value) const; + void EmitShort(int Value) const; - /// EmitSLEB128 - Emit a series of hexidecimal values (separated by commas) - /// representing a signed leb128 value. + /// EmitLong - Emit a long directive and value. /// - void EmitSLEB128(int Value) const; + void EmitLong(int Value) const; - /// EmitLabelName - Emit label name for internal use by dwarf. + /// EmitString - Emit a string with quotes and a null terminator. + /// Special characters are emitted properly. (Eg. '\t') + void DwarfWriter::EmitString(const std::string &String) const; + + /// PrintLabelName - Print label name in form used by Dwarf writer. /// - void EmitLabelName(const char *Tag, int Num) const; + void PrintLabelName(DWLabel Label) const { + PrintLabelName(Label.Tag, Label.Number); + } + void PrintLabelName(const char *Tag, unsigned Number) const; - /// EmitLabel - Emit location label for internal use by dwarf. + /// EmitLabel - Emit location label for internal use by Dwarf. /// - void EmitLabel(const char *Tag, int Num) const; + void EmitLabel(DWLabel Label) const { + EmitLabel(Label.Tag, Label.Number); + } + void EmitLabel(const char *Tag, unsigned Number) const; - /// EmitULEB128Bytes - Emit an assembler byte data directive to compose an - /// unsigned leb128 value. Comment is added to the end of the directive if - /// DwarfVerbose is true (should not contain any newlines.) + /// EmitLabelReference - Emit a reference to a label. + /// + void EmitLabelReference(DWLabel Label) const { + EmitLabelReference(Label.Tag, Label.Number); + } + void EmitLabelReference(const char *Tag, unsigned Number) const; + + /// EmitDifference - Emit the difference between two labels. Some + /// assemblers do not behave with absolute expressions with data directives, + /// so there is an option (needsSet) to use an intermediary set expression. + void EmitDifference(DWLabel Label1, DWLabel Label2) const { + EmitDifference(Label1.Tag, Label1.Number, Label2.Tag, Label2.Number); + } + void EmitDifference(const char *Tag1, unsigned Number1, + const char *Tag2, unsigned Number2) const; + +private: + /// NewDIE - Construct a new structured debug information entry. + /// + DIE *NewDIE(const unsigned char *AbbrevData); + + /// NewCompileUnit - Create new compile unit information. + /// + DIE *NewCompileUnit(const std::string &Directory, + const std::string &SourceName); + + /// EmitInitial - Emit initial Dwarf declarations. /// - void EmitULEB128Bytes(unsigned Value, const char *Comment) const; + void EmitInitial() const; - /// EmitSLEB128Bytes - Emit an assembler byte data directive to compose a - /// signed leb128 value. Comment is added to the end of the directive if - /// DwarfVerbose is true (should not contain any newlines.) + /// EmitDIE - Recusively Emits a debug information entry. /// - void EmitSLEB128Bytes(int Value, const char *Comment) const; + void EmitDIE(DIE *Die) const; - /// EmitInitial - Emit initial dwarf declarations. + /// SizeAndOffsetDie - Compute the size and offset of a DIE. /// - void EmitInitial() const; + unsigned SizeAndOffsetDie(DIE *Die, unsigned Offset) const; + + /// SizeAndOffsets - Compute the size and offset of all the DIEs. + /// + void SizeAndOffsets(); - /// ShouldEmitDwarf - Returns true if dwarf declarations should be made. + /// EmitDebugInfo - Emit the debug info section. + /// + void EmitDebugInfo() const; + + /// EmitAbbreviations - Emit the abbreviation section. + /// + void EmitAbbreviations() const; + + /// EmitDebugLines - Emit source line information. + /// + void EmitDebugLines() const; + + /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made. /// When called it also checks to see if debug info is newly available. if - /// so the initial dwarf headers are emitted. + /// so the initial Dwarf headers are emitted. bool ShouldEmitDwarf(); - - /// BeginModule - Emit all dwarf sections that should come prior to the + + public: + + DwarfWriter(std::ostream &o, AsmPrinter *ap); + virtual ~DwarfWriter(); + + /// SetDebugInfo - Set DebugInfo when it's known that pass manager has + /// created it. Set by the target AsmPrinter. + void SetDebugInfo(MachineDebugInfo *di) { DebugInfo = di; } + + //===------------------------------------------------------------------===// + // Main enties. + // + + /// BeginModule - Emit all Dwarf sections that should come prior to the /// content. void BeginModule(); - /// EndModule - Emit all dwarf sections that should come after the content. + /// EndModule - Emit all Dwarf sections that should come after the content. /// void EndModule(); @@ -571,7 +906,6 @@ /// void EndFunction(); }; - } // end llvm namespace Index: llvm/include/llvm/CodeGen/MachineDebugInfo.h diff -u llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.5 llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.6 --- llvm/include/llvm/CodeGen/MachineDebugInfo.h:1.5 Wed Jan 4 19:25:28 2006 +++ llvm/include/llvm/CodeGen/MachineDebugInfo.h Tue Jan 17 11:31:53 2006 @@ -10,17 +10,83 @@ // Collect debug information for a module. This information should be in a // neutral form that can be used by different debugging schemes. // +// The organization of information is primarily clustered around the source +// compile units. The main exception is source line coorespondence where +// inlining may interleave code from various compile units. +// +// The following information can be retrieved from the MachineDebugInfo. +// +// -- Source directories - Directories are uniqued based on their canonical +// string and assigned a sequential numeric ID (base 1.) A directory ID - 1 +// provides the index of directory information in a queried directory list. +// -- Source files - Files are also uniqued based on their name and directory +// ID. A file ID is sequential number (base 1.) A file ID - 1 provides the +// index of source information in a queried file list. +// -- Source line coorespondence - A vector of file ID, line#, column# triples. +// A DEBUG_LOCATION instruction is generated by the DAG Legalizer +// corresponding to each entry in the source line list. This allows a debug +// information emitter to generate labels to map code addressed to debug +// tables. +// //===----------------------------------------------------------------------===// #ifndef LLVM_CODEGEN_MACHINEDEBUGINFO_H #define LLVM_CODEGEN_MACHINEDEBUGINFO_H #include "llvm/Pass.h" +#include "llvm/ADT/UniqueVector.h" #include -#include -#include namespace llvm { + +//===----------------------------------------------------------------------===// +/// SourceLineInfo - This class is used to record source line correspondence. +/// +class SourceLineInfo { +private: + unsigned Line; // Source line number. + unsigned Column; // Source column. + unsigned SourceID; // Source ID number. + +public: + SourceLineInfo(unsigned L, unsigned C, unsigned S) + : Line(L), Column(C), SourceID(S) {} + + // Accessors + unsigned getLine() const { return Line; } + unsigned getColumn() const { return Column; } + unsigned getSourceID() const { return SourceID; } +}; + +//===----------------------------------------------------------------------===// +/// SourceFileInfo - This class is used to track source information. +/// +class SourceFileInfo { +private: + unsigned DirectoryID; // Directory ID number. + std::string Name; // File name (not including directory.) + +public: + SourceFileInfo(unsigned D, const std::string &N) : DirectoryID(D), Name(N) {} + + // Accessors + unsigned getDirectoryID() const { return DirectoryID; } + const std::string &getName() const { return Name; } + + /// operator== - Used by UniqueVector to locate entry. + /// + bool operator==(const SourceFileInfo &SI) const { + return getDirectoryID() == SI.getDirectoryID() && getName() == SI.getName(); + } + + /// operator< - Used by UniqueVector to locate entry. + /// + bool operator<(const SourceFileInfo &SI) const { + return getDirectoryID() < SI.getDirectoryID() || + (getDirectoryID() == SI.getDirectoryID() && getName() < SI.getName()); + } +}; + //===----------------------------------------------------------------------===// /// MachineDebugInfo - This class contains debug information specific to a /// module. Queries can be made by different debugging schemes and reformated @@ -28,48 +94,70 @@ /// class MachineDebugInfo : public ImmutablePass { private: - std::map SourceMap; // Map of source file path to id - unsigned SourceCount; // Number of source files (used to - // generate id) - unsigned UniqueID; // Number used to unique labels used - // by debugger. + // DirectoryMap - UniqueVector for directories. + UniqueVector Directories; + + // SourceMap - UniqueVector for source files. + UniqueVector SourceFiles; + + // Lines - List of of source line correspondence. + std::vector Lines; public: - // Ctor. MachineDebugInfo() - : SourceMap() - , SourceCount(0) - , UniqueID(1) + : Directories() + , SourceFiles() + , Lines() {} ~MachineDebugInfo() { } - /// hasInfo - Returns true if debug info is present. + /// doInitialization - Initialize the debug state for a new module. /// - // FIXME - need scheme to suppress debug output. - bool hasInfo() const { return SourceCount != 0; } + bool doInitialization(); + + + /// doFinalization - Tear down the debug state after completion of a module. + /// + bool doFinalization(); - /// getNextUniqueID - Returns a unique number for labels used by debugger. + /// hasInfo - Returns true if debug info is present. /// - unsigned getNextUniqueID() { return UniqueID++; } + // FIXME - need proper scheme to suppress debug output. + bool hasInfo() const { return !SourceFiles.empty(); } /// RecordLabel - Records location information and associates it with a - /// debug label. Returns unique label id. - unsigned RecordLabel(unsigned Line, unsigned Col, unsigned SrcFile) { - // FIXME - actually record. - return getNextUniqueID(); + /// debug label. Returns a unique label ID used to generate a label and + /// provide correspondence to the source line list. + unsigned RecordLabel(unsigned Line, unsigned Column, unsigned Source) { + Lines.push_back(new SourceLineInfo(Line, Column, Source)); + return Lines.size(); } - bool doInitialization(); - bool doFinalization(); + /// RecordSource - Register a source file with debug info. Returns an source + /// ID. + unsigned RecordSource(const std::string &Directory, + const std::string &Source) { + unsigned DirectoryID = Directories.insert(Directory); + return SourceFiles.insert(SourceFileInfo(DirectoryID, Source)); + } - /// getUniqueSourceID - Register a source file with debug info. Returns an id. - /// - unsigned getUniqueSourceID(const std::string &fname, - const std::string &dirname); + /// getDirectories - Return the UniqueVector of std::string representing + /// directories. + const UniqueVector &getDirectories() const { + return Directories; + } - /// getSourceFiles - Return a vector of files. Vector index + 1 equals id. + /// getSourceFiles - Return the UniqueVector of source files. /// - std::vector getSourceFiles() const; + const UniqueVector &getSourceFiles() const { + return SourceFiles; + } + + /// getSourceLines - Return a vector of source lines. Vector index + 1 + /// equals label ID. + const std::vector &getSourceLines() const { + return Lines; + } }; // End class MachineDebugInfo From lattner at cs.uiuc.edu Tue Jan 17 11:46:57 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 17 Jan 2006 11:46:57 -0600 Subject: [llvm-commits] CVS: llvm-test/SingleSource/Regression/C/2004-08-12-InlinerAndAllocas.c Message-ID: <200601171746.LAA05897@zion.cs.uiuc.edu> Changes in directory llvm-test/SingleSource/Regression/C: 2004-08-12-InlinerAndAllocas.c updated: 1.2 -> 1.3 --- Log message: The old f-e doesn't insert the required llvm.stacksave/stackrestore intrinsics. --- Diffs of the changes: (+1 -0) 2004-08-12-InlinerAndAllocas.c | 1 + 1 files changed, 1 insertion(+) Index: llvm-test/SingleSource/Regression/C/2004-08-12-InlinerAndAllocas.c diff -u llvm-test/SingleSource/Regression/C/2004-08-12-InlinerAndAllocas.c:1.2 llvm-test/SingleSource/Regression/C/2004-08-12-InlinerAndAllocas.c:1.3 --- llvm-test/SingleSource/Regression/C/2004-08-12-InlinerAndAllocas.c:1.2 Tue Mar 8 09:51:08 2005 +++ llvm-test/SingleSource/Regression/C/2004-08-12-InlinerAndAllocas.c Tue Jan 17 11:46:46 2006 @@ -1,5 +1,6 @@ // A compiler cannot inline Callee into main unless it is prepared to reclaim // the stack memory allocated in it. +// XFAIL: * #ifdef __FreeBSD__ #include From lattner at cs.uiuc.edu Tue Jan 17 12:27:28 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 17 Jan 2006 12:27:28 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Message-ID: <200601171827.MAA06257@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: SimplifyLibCalls.cpp updated: 1.55 -> 1.56 --- Log message: Clean up the FFS optimization code, and make it correctly create the appropriate unsigned llvm.cttz.* intrinsic, fixing the 2005-05-11-Popcount-ffs-fls regression last night. --- Diffs of the changes: (+43 -41) SimplifyLibCalls.cpp | 84 ++++++++++++++++++++++++++------------------------- 1 files changed, 43 insertions(+), 41 deletions(-) Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.55 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.56 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.55 Sat Oct 22 23:37:20 2005 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Tue Jan 17 12:27:17 2006 @@ -1810,69 +1810,71 @@ /// optimization is to compute the result at compile time if the argument is /// a constant. /// @brief Simplify the ffs library function. -struct FFSOptimization : public LibCallOptimization -{ +struct FFSOptimization : public LibCallOptimization { protected: /// @brief Subclass Constructor FFSOptimization(const char* funcName, const char* description) - : LibCallOptimization(funcName, description) - {} + : LibCallOptimization(funcName, description) {} public: /// @brief Default Constructor FFSOptimization() : LibCallOptimization("ffs", "Number of 'ffs' calls simplified") {} - /// @brief Make sure that the "fputs" function has the right prototype - virtual bool ValidateCalledFunction(const Function* f, SimplifyLibCalls& SLC) - { + /// @brief Make sure that the "ffs" function has the right prototype + virtual bool ValidateCalledFunction(const Function *F, SimplifyLibCalls &SLC){ // Just make sure this has 2 arguments - return (f->arg_size() == 1 && f->getReturnType() == Type::IntTy); + return F->arg_size() == 1 && F->getReturnType() == Type::IntTy; } /// @brief Perform the ffs optimization. - virtual bool OptimizeCall(CallInst* ci, SimplifyLibCalls& SLC) - { - if (ConstantInt* CI = dyn_cast(ci->getOperand(1))) - { + virtual bool OptimizeCall(CallInst *TheCall, SimplifyLibCalls &SLC) { + if (ConstantInt *CI = dyn_cast(TheCall->getOperand(1))) { // ffs(cnst) -> bit# // ffsl(cnst) -> bit# // ffsll(cnst) -> bit# uint64_t val = CI->getRawValue(); int result = 0; - while (val != 0) { - result +=1; - if (val&1) - break; - val >>= 1; + if (val) { + ++result; + while ((val & 1) == 0) { + ++result; + val >>= 1; + } } - ci->replaceAllUsesWith(ConstantSInt::get(Type::IntTy, result)); - ci->eraseFromParent(); + TheCall->replaceAllUsesWith(ConstantSInt::get(Type::IntTy, result)); + TheCall->eraseFromParent(); return true; } - // ffs(x) -> ( x == 0 ? 0 : llvm.cttz(x)+1) - // ffsl(x) -> ( x == 0 ? 0 : llvm.cttz(x)+1) - // ffsll(x) -> ( x == 0 ? 0 : llvm.cttz(x)+1) - const Type* arg_type = ci->getOperand(1)->getType(); - std::vector args; - args.push_back(arg_type); - FunctionType* llvm_cttz_type = FunctionType::get(arg_type,args,false); - Function* F = - SLC.getModule()->getOrInsertFunction("llvm.cttz",llvm_cttz_type); - std::string inst_name(ci->getName()+".ffs"); - Instruction* call = - new CallInst(F, ci->getOperand(1), inst_name, ci); - if (arg_type != Type::IntTy) - call = new CastInst(call, Type::IntTy, inst_name, ci); - BinaryOperator* add = BinaryOperator::createAdd(call, - ConstantSInt::get(Type::IntTy,1), inst_name, ci); - SetCondInst* eq = new SetCondInst(Instruction::SetEQ,ci->getOperand(1), - ConstantSInt::get(ci->getOperand(1)->getType(),0),inst_name,ci); - SelectInst* select = new SelectInst(eq,ConstantSInt::get(Type::IntTy,0),add, - inst_name,ci); - ci->replaceAllUsesWith(select); - ci->eraseFromParent(); + // ffs(x) -> x == 0 ? 0 : llvm.cttz(x)+1 + // ffsl(x) -> x == 0 ? 0 : llvm.cttz(x)+1 + // ffsll(x) -> x == 0 ? 0 : llvm.cttz(x)+1 + const Type *ArgType = TheCall->getOperand(1)->getType(); + ArgType = ArgType->getUnsignedVersion(); + const char *CTTZName; + switch (ArgType->getTypeID()) { + default: assert(0 && "Unknown unsigned type!"); + case Type::UByteTyID : CTTZName = "llvm.cttz.i8" ; break; + case Type::UShortTyID: CTTZName = "llvm.cttz.i16"; break; + case Type::UIntTyID : CTTZName = "llvm.cttz.i32"; break; + case Type::ULongTyID : CTTZName = "llvm.cttz.i64"; break; + } + + Function *F = SLC.getModule()->getOrInsertFunction(CTTZName, ArgType, + ArgType, NULL); + Value *V = new CastInst(TheCall->getOperand(1), ArgType, "tmp", TheCall); + Value *V2 = new CallInst(F, V, "tmp", TheCall); + V2 = new CastInst(V2, Type::IntTy, "tmp", TheCall); + V2 = BinaryOperator::createAdd(V2, ConstantSInt::get(Type::IntTy, 1), + "tmp", TheCall); + Value *Cond = + BinaryOperator::createSetEQ(V, Constant::getNullValue(V->getType()), + "tmp", TheCall); + V2 = new SelectInst(Cond, ConstantInt::get(Type::IntTy, 0), V2, + TheCall->getName(), TheCall); + TheCall->replaceAllUsesWith(V2); + TheCall->eraseFromParent(); return true; } } FFSOptimizer; From jlaskey at apple.com Tue Jan 17 13:12:36 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 13:12:36 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601171912.NAA06520@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.7 -> 1.8 --- Log message: Misc. errors. --- Diffs of the changes: (+12 -7) DwarfWriter.h | 19 ++++++++++++------- 1 files changed, 12 insertions(+), 7 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.7 llvm/include/llvm/CodeGen/DwarfWriter.h:1.8 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.7 Tue Jan 17 11:31:53 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Tue Jan 17 13:12:24 2006 @@ -17,15 +17,13 @@ // //===----------------------------------------------------------------------===// -#ifndef LLVM_CODEGEN_DWARFPRINTER_H -#define LLVM_CODEGEN_DWARFPRINTER_H +#ifndef LLVM_CODEGEN_DWARFWRITER_H +#define LLVM_CODEGEN_DWARFWRITER_H #include "llvm/ADT/UniqueVector.h" #include -#include #include -#include namespace llvm { @@ -567,7 +565,7 @@ struct DIELabel : public DIEValue { const DWLabel Value; - DIELabel(const DWLabel &V) : DIEValue(DW_FORM_ref4), Value(V) {} + DIELabel(const DWLabel &V) : DIEValue(isLabel), Value(V) {} // Implement isa/cast/dyncast. static bool classof(const DWLabel *) { return true; } @@ -590,7 +588,7 @@ const DWLabel Value2; DIEDelta(const DWLabel &V1, const DWLabel &V2) - : DIEValue(DW_FORM_addr), Value1(V1), Value2(V2) {} + : DIEValue(isDelta), Value1(V1), Value2(V2) {} // Implement isa/cast/dyncast. static bool classof(const DIEDelta *) { return true; } @@ -624,7 +622,14 @@ , Children() , Values() {} - virtual ~DIE() { + ~DIE() { + for (unsigned i = 0, N = Children.size(); i < N; i++) { + delete Children[i]; + } + + for (unsigned j = 0, M = Children.size(); j < M; j++) { + delete Children[j]; + } } // Accessors From evan.cheng at apple.com Tue Jan 17 13:21:14 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 17 Jan 2006 13:21:14 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/ADT/UniqueVector.h Message-ID: <200601171921.NAA07725@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/ADT: UniqueVector.h updated: 1.3 -> 1.4 --- Log message: Suppress "no newline at end of file" warnings. --- Diffs of the changes: (+1 -1) UniqueVector.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/ADT/UniqueVector.h diff -u llvm/include/llvm/ADT/UniqueVector.h:1.3 llvm/include/llvm/ADT/UniqueVector.h:1.4 --- llvm/include/llvm/ADT/UniqueVector.h:1.3 Tue Jan 17 10:29:58 2006 +++ llvm/include/llvm/ADT/UniqueVector.h Tue Jan 17 13:21:01 2006 @@ -67,4 +67,4 @@ } // End of namespace llvm -#endif // LLVM_ADT_UNIQUEVECTOR_H \ No newline at end of file +#endif // LLVM_ADT_UNIQUEVECTOR_H From evan.cheng at apple.com Tue Jan 17 13:47:25 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 17 Jan 2006 13:47:25 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601171947.NAA11563@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.268 -> 1.269 --- Log message: Bug fix: missing LegalizeOp() on newly created nodes. --- Diffs of the changes: (+6 -1) LegalizeDAG.cpp | 7 ++++++- 1 files changed, 6 insertions(+), 1 deletion(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.268 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.269 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.268 Tue Jan 17 11:31:53 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Tue Jan 17 13:47:13 2006 @@ -1639,6 +1639,7 @@ // Perform the larger operation, then round down. Result = DAG.getNode(ISD::SELECT, NVT, Tmp1, Tmp2,Tmp3); Result = DAG.getNode(TruncOp, Node->getValueType(0), Result); + Result = LegalizeOp(Result); break; } } @@ -1838,6 +1839,7 @@ Result = DAG.getNode(ISD::SETCC, Node->getValueType(0), Tmp1, Tmp2, Node->getOperand(2)); + Result = LegalizeOp(Result); break; } case TargetLowering::Custom: { @@ -2246,6 +2248,7 @@ Tmp1 = DAG.getNode(ISD::BSWAP, NVT, Tmp1); Result = DAG.getNode(ISD::SRL, NVT, Tmp1, DAG.getConstant(DiffBits, TLI.getShiftAmountTy())); + Result = LegalizeOp(Result); break; } case TargetLowering::Custom: @@ -2316,6 +2319,7 @@ break; } } + Result = LegalizeOp(Result); break; } } @@ -2358,6 +2362,7 @@ getSizeInBits(OVT), NVT)); break; } + Result = LegalizeOp(Result); break; } case TargetLowering::Custom: @@ -2384,7 +2389,7 @@ DAG.getNode(ISD::SRL, VT, Tmp1, Tmp3), Tmp2)); } - Result = Tmp1; + Result = LegalizeOp(Tmp1); break; } case ISD::CTLZ: { From bocchino at persephone.cs.uiuc.edu Tue Jan 17 14:08:03 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Tue, 17 Jan 2006 14:08:03 -0600 (CST) Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/Local.cpp Message-ID: <20060117200803.B4F741D5103D@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: Local.cpp updated: 1.50 -> 1.51 --- Log message: Constant folding support for the insertelement operation. --- Diffs of the changes: (+3 -0) Local.cpp | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/lib/Transforms/Utils/Local.cpp diff -u llvm/lib/Transforms/Utils/Local.cpp:1.50 llvm/lib/Transforms/Utils/Local.cpp:1.51 --- llvm/lib/Transforms/Utils/Local.cpp:1.50 Mon Jan 16 15:12:35 2006 +++ llvm/lib/Transforms/Utils/Local.cpp Tue Jan 17 14:07:07 2006 @@ -104,6 +104,9 @@ return 0; case Instruction::ExtractElement: return ConstantExpr::getExtractElement(Op0, Op1); + case Instruction::InsertElement: + if (Constant *Op2 = dyn_cast(I->getOperand(2))) + return ConstantExpr::getInsertElement(Op0, Op1, Op2); case Instruction::GetElementPtr: std::vector IdxList; IdxList.reserve(I->getNumOperands()-1); From bocchino at persephone.cs.uiuc.edu Tue Jan 17 14:08:01 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Tue, 17 Jan 2006 14:08:01 -0600 (CST) Subject: [llvm-commits] CVS: llvm/test/Feature/instructions.ll Message-ID: <20060117200801.1133E1D51040@persephone.cs.uiuc.edu> Changes in directory llvm/test/Feature: instructions.ll updated: 1.1 -> 1.2 --- Log message: Test case for the insertelement operation. --- Diffs of the changes: (+7 -2) instructions.ll | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/test/Feature/instructions.ll diff -u llvm/test/Feature/instructions.ll:1.1 llvm/test/Feature/instructions.ll:1.2 --- llvm/test/Feature/instructions.ll:1.1 Tue Jan 10 14:00:20 2006 +++ llvm/test/Feature/instructions.ll Tue Jan 17 14:07:30 2006 @@ -3,6 +3,11 @@ ; RUN: diff %t1.ll %t2.ll uint %test_extractelement(<4 x uint> %V) { - %R = extractelement <4 x uint> %V, uint 1 - ret uint %R + %R = extractelement <4 x uint> %V, uint 1 + ret uint %R +} + +<4 x uint> %test_insertelement(<4 x uint> %V) { + %R = insertelement <4 x uint> %V, uint 0, uint 0 + ret <4 x uint> %R } From bocchino at persephone.cs.uiuc.edu Tue Jan 17 14:08:01 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Tue, 17 Jan 2006 14:08:01 -0600 (CST) Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/LowerPacked.cpp SCCP.cpp Message-ID: <20060117200801.173AF1D51041@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: LowerPacked.cpp updated: 1.7 -> 1.8 SCCP.cpp updated: 1.126 -> 1.127 --- Log message: Lowerpacked and SCCP support for the insertelement operation. --- Diffs of the changes: (+66 -8) LowerPacked.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++-------- SCCP.cpp | 21 +++++++++++++++++++++ 2 files changed, 66 insertions(+), 8 deletions(-) Index: llvm/lib/Transforms/Scalar/LowerPacked.cpp diff -u llvm/lib/Transforms/Scalar/LowerPacked.cpp:1.7 llvm/lib/Transforms/Scalar/LowerPacked.cpp:1.8 --- llvm/lib/Transforms/Scalar/LowerPacked.cpp:1.7 Tue Jan 10 13:05:05 2006 +++ llvm/lib/Transforms/Scalar/LowerPacked.cpp Tue Jan 17 14:06:55 2006 @@ -61,8 +61,12 @@ /// @brief Lowers packed extractelement instructions. /// @param EI the extractelement operator to convert - void visitExtractElementInst(ExtractElementInst& EI); + void visitExtractElementInst(ExtractElementInst& EE); + /// @brief Lowers packed insertelement instructions. + /// @param EI the insertelement operator to convert + void visitInsertElementInst(InsertElementInst& IE); + /// This function asserts if the instruction is a PackedType but /// is handled by another function. /// @@ -345,22 +349,55 @@ if (ConstantUInt *C = dyn_cast(op1)) { EI.replaceAllUsesWith(op0Vals[C->getValue()]); } else { - AllocaInst *alloca = new AllocaInst(PTy->getElementType(), - ConstantUInt::get(Type::UIntTy, PTy->getNumElements()), - EI.getName() + ".alloca", &(EI.getParent()->getParent()->getEntryBlock().front())); + AllocaInst *alloca = + new AllocaInst(PTy->getElementType(), + ConstantUInt::get(Type::UIntTy, PTy->getNumElements()), + EI.getName() + ".alloca", + EI.getParent()->getParent()->getEntryBlock().begin()); for (unsigned i = 0; i < PTy->getNumElements(); ++i) { - GetElementPtrInst *GEP = new GetElementPtrInst(alloca, ConstantUInt::get(Type::UIntTy, i), - "store.ge", &EI); + GetElementPtrInst *GEP = + new GetElementPtrInst(alloca, ConstantUInt::get(Type::UIntTy, i), + "store.ge", &EI); new StoreInst(op0Vals[i], GEP, &EI); } - GetElementPtrInst *GEP = new GetElementPtrInst(alloca, op1, - EI.getName() + ".ge", &EI); + GetElementPtrInst *GEP = + new GetElementPtrInst(alloca, op1, EI.getName() + ".ge", &EI); LoadInst *load = new LoadInst(GEP, EI.getName() + ".load", &EI); EI.replaceAllUsesWith(load); } Changed = true; instrsToRemove.push_back(&EI); +} + +void LowerPacked::visitInsertElementInst(InsertElementInst& IE) +{ + std::vector& Vals = getValues(IE.getOperand(0)); + Value *Elt = IE.getOperand(1); + Value *Idx = IE.getOperand(2); + std::vector result; + result.reserve(Vals.size()); + + if (ConstantUInt *C = dyn_cast(Idx)) { + unsigned idxVal = C->getValue(); + for (unsigned i = 0; i != Vals.size(); ++i) { + result.push_back(i == idxVal ? Elt : Vals[i]); + } + } else { + for (unsigned i = 0; i != Vals.size(); ++i) { + SetCondInst *setcc = + new SetCondInst(Instruction::SetEQ, Idx, + ConstantUInt::get(Type::UIntTy, i), + "setcc", &IE); + SelectInst *select = + new SelectInst(setcc, Elt, Vals[i], "select", &IE); + result.push_back(select); + } + } + + setValues(&IE, result); + Changed = true; + instrsToRemove.push_back(&IE); } bool LowerPacked::runOnFunction(Function& F) Index: llvm/lib/Transforms/Scalar/SCCP.cpp diff -u llvm/lib/Transforms/Scalar/SCCP.cpp:1.126 llvm/lib/Transforms/Scalar/SCCP.cpp:1.127 --- llvm/lib/Transforms/Scalar/SCCP.cpp:1.126 Tue Jan 10 13:05:05 2006 +++ llvm/lib/Transforms/Scalar/SCCP.cpp Tue Jan 17 14:06:55 2006 @@ -323,6 +323,7 @@ void visitBinaryOperator(Instruction &I); void visitShiftInst(ShiftInst &I) { visitBinaryOperator(I); } void visitExtractElementInst(ExtractElementInst &I); + void visitInsertElementInst(InsertElementInst &I); // Instructions that cannot be folded away... void visitStoreInst (Instruction &I); @@ -738,6 +739,26 @@ else if(ValState.isConstant() && IdxState.isConstant()) markConstant(&I, ConstantExpr::getExtractElement(ValState.getConstant(), IdxState.getConstant())); +} + +void SCCPSolver::visitInsertElementInst(InsertElementInst &I) { + LatticeVal &ValState = getValueState(I.getOperand(0)); + LatticeVal &EltState = getValueState(I.getOperand(1)); + LatticeVal &IdxState = getValueState(I.getOperand(2)); + + if (ValState.isOverdefined() || EltState.isOverdefined() || + IdxState.isOverdefined()) + markOverdefined(&I); + else if(ValState.isConstant() && EltState.isConstant() && + IdxState.isConstant()) + markConstant(&I, ConstantExpr::getInsertElement(ValState.getConstant(), + EltState.getConstant(), + IdxState.getConstant())); + else if (ValState.isUndefined() && EltState.isConstant() && + IdxState.isConstant()) + markConstant(&I, ConstantExpr::getInsertElement(UndefValue::get(I.getType()), + EltState.getConstant(), + IdxState.getConstant())); } // Handle getelementptr instructions... if all operands are constants then we From bocchino at persephone.cs.uiuc.edu Tue Jan 17 14:08:01 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Tue, 17 Jan 2006 14:08:01 -0600 (CST) Subject: [llvm-commits] CVS: llvm/lib/VMCore/ConstantFolding.cpp ConstantFolding.h Constants.cpp Instruction.cpp Instructions.cpp Verifier.cpp Message-ID: <20060117200801.09DDB1D5103F@persephone.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: ConstantFolding.cpp updated: 1.82 -> 1.83 ConstantFolding.h updated: 1.46 -> 1.47 Constants.cpp updated: 1.144 -> 1.145 Instruction.cpp updated: 1.49 -> 1.50 Instructions.cpp updated: 1.30 -> 1.31 Verifier.cpp updated: 1.143 -> 1.144 --- Log message: VMCore support for the insertelement operation. --- Diffs of the changes: (+147 -9) ConstantFolding.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++ ConstantFolding.h | 3 ++ Constants.cpp | 49 +++++++++++++++++++++++++++++++++++++++++--- Instruction.cpp | 1 Instructions.cpp | 25 ++++++++++++++++++++-- Verifier.cpp | 21 +++++++++++++++---- 6 files changed, 147 insertions(+), 9 deletions(-) Index: llvm/lib/VMCore/ConstantFolding.cpp diff -u llvm/lib/VMCore/ConstantFolding.cpp:1.82 llvm/lib/VMCore/ConstantFolding.cpp:1.83 --- llvm/lib/VMCore/ConstantFolding.cpp:1.82 Tue Jan 10 14:03:46 2006 +++ llvm/lib/VMCore/ConstantFolding.cpp Tue Jan 17 14:07:22 2006 @@ -734,6 +734,63 @@ return 0; } +Constant *llvm::ConstantFoldInsertElementInstruction(const Constant *Val, + const Constant *Elt, + const Constant *Idx) { + const ConstantUInt *CIdx = dyn_cast(Idx); + if (!CIdx) return 0; + unsigned idxVal = CIdx->getValue(); + if (const UndefValue *UVal = dyn_cast(Val)) { + // Insertion of scalar constant into packed undef + // Optimize away insertion of undef + if (isa(Elt)) + return const_cast(Val); + // Otherwise break the aggregate undef into multiple undefs and do + // the insertion + unsigned numOps = + cast(Val->getType())->getNumElements(); + std::vector Ops; + Ops.reserve(numOps); + for (unsigned i = 0; i < numOps; ++i) { + const Constant *Op = + (i == idxVal) ? Elt : UndefValue::get(Elt->getType()); + Ops.push_back(const_cast(Op)); + } + return ConstantPacked::get(Ops); + } + if (const ConstantAggregateZero *CVal = + dyn_cast(Val)) { + // Insertion of scalar constant into packed aggregate zero + // Optimize away insertion of zero + if (Elt->isNullValue()) + return const_cast(Val); + // Otherwise break the aggregate zero into multiple zeros and do + // the insertion + unsigned numOps = + cast(Val->getType())->getNumElements(); + std::vector Ops; + Ops.reserve(numOps); + for (unsigned i = 0; i < numOps; ++i) { + const Constant *Op = + (i == idxVal) ? Elt : Constant::getNullValue(Elt->getType()); + Ops.push_back(const_cast(Op)); + } + return ConstantPacked::get(Ops); + } + if (const ConstantPacked *CVal = dyn_cast(Val)) { + // Insertion of scalar constant into packed constant + std::vector Ops; + Ops.reserve(CVal->getNumOperands()); + for (unsigned i = 0; i < CVal->getNumOperands(); ++i) { + const Constant *Op = + (i == idxVal) ? Elt : cast(CVal->getOperand(i)); + Ops.push_back(const_cast(Op)); + } + return ConstantPacked::get(Ops); + } + return 0; +} + /// isZeroSizedType - This type is zero sized if its an array or structure of /// zero sized types. The only leaf zero sized type is an empty structure. static bool isMaybeZeroSizedType(const Type *Ty) { Index: llvm/lib/VMCore/ConstantFolding.h diff -u llvm/lib/VMCore/ConstantFolding.h:1.46 llvm/lib/VMCore/ConstantFolding.h:1.47 --- llvm/lib/VMCore/ConstantFolding.h:1.46 Tue Jan 10 14:03:46 2006 +++ llvm/lib/VMCore/ConstantFolding.h Tue Jan 17 14:07:22 2006 @@ -33,6 +33,9 @@ const Constant *V2); Constant *ConstantFoldExtractElementInstruction(const Constant *Val, const Constant *Idx); + Constant *ConstantFoldInsertElementInstruction(const Constant *Val, + const Constant *Elt, + const Constant *Idx); Constant *ConstantFoldBinaryInstruction(unsigned Opcode, const Constant *V1, const Constant *V2); Constant *ConstantFoldGetElementPtr(const Constant *C, Index: llvm/lib/VMCore/Constants.cpp diff -u llvm/lib/VMCore/Constants.cpp:1.144 llvm/lib/VMCore/Constants.cpp:1.145 --- llvm/lib/VMCore/Constants.cpp:1.144 Tue Jan 10 14:03:46 2006 +++ llvm/lib/VMCore/Constants.cpp Tue Jan 17 14:07:22 2006 @@ -347,8 +347,9 @@ } }; -/// ExtractElementConstantExpr - This class is private to Constants.cpp, and is used -/// behind the scenes to implement extractelement constant exprs. +/// ExtractElementConstantExpr - This class is private to +/// Constants.cpp, and is used behind the scenes to implement +/// extractelement constant exprs. class ExtractElementConstantExpr : public ConstantExpr { Use Ops[2]; public: @@ -360,6 +361,21 @@ } }; +/// InsertElementConstantExpr - This class is private to +/// Constants.cpp, and is used behind the scenes to implement +/// insertelement constant exprs. +class InsertElementConstantExpr : public ConstantExpr { + Use Ops[3]; +public: + InsertElementConstantExpr(Constant *C1, Constant *C2, Constant *C3) + : ConstantExpr(C1->getType(), Instruction::InsertElement, + Ops, 3) { + Ops[0].init(C1, this); + Ops[1].init(C2, this); + Ops[2].init(C3, this); + } +}; + /// GetElementPtrConstantExpr - This class is private to Constants.cpp, and is /// used behind the scenes to implement getelementpr constant exprs. struct GetElementPtrConstantExpr : public ConstantExpr { @@ -1156,6 +1172,9 @@ return new SelectConstantExpr(V.second[0], V.second[1], V.second[2]); if (V.first == Instruction::ExtractElement) return new ExtractElementConstantExpr(V.second[0], V.second[1]); + if (V.first == Instruction::InsertElement) + return new InsertElementConstantExpr(V.second[0], V.second[1], + V.second[2]); assert(V.first == Instruction::GetElementPtr && "Invalid ConstantExpr!"); @@ -1416,9 +1435,33 @@ assert(isa(Val->getType()) && "Tried to create extractelement operation on non-packed type!"); assert(Idx->getType() == Type::UIntTy && - "Index must be uint type!"); + "Extractelement index must be uint type!"); return getExtractElementTy(cast(Val->getType())->getElementType(), Val, Idx); +} + +Constant *ConstantExpr::getInsertElementTy(const Type *ReqTy, Constant *Val, + Constant *Elt, Constant *Idx) { + if (Constant *FC = ConstantFoldInsertElementInstruction(Val, Elt, Idx)) + return FC; // Fold a few common cases... + // Look up the constant in the table first to ensure uniqueness + std::vector ArgVec(1, Val); + ArgVec.push_back(Elt); + ArgVec.push_back(Idx); + const ExprMapKeyType &Key = std::make_pair(Instruction::InsertElement,ArgVec); + return ExprConstants.getOrCreate(ReqTy, Key); +} + +Constant *ConstantExpr::getInsertElement(Constant *Val, Constant *Elt, + Constant *Idx) { + assert(isa(Val->getType()) && + "Tried to create insertelement operation on non-packed type!"); + assert(Elt->getType() == cast(Val->getType())->getElementType() + && "Insertelement types must match!"); + assert(Idx->getType() == Type::UIntTy && + "Insertelement index must be uint type!"); + return getInsertElementTy(cast(Val->getType())->getElementType(), + Val, Elt, Idx); } // destroyConstant - Remove the constant from the constant table... Index: llvm/lib/VMCore/Instruction.cpp diff -u llvm/lib/VMCore/Instruction.cpp:1.49 llvm/lib/VMCore/Instruction.cpp:1.50 --- llvm/lib/VMCore/Instruction.cpp:1.49 Tue Jan 10 13:05:24 2006 +++ llvm/lib/VMCore/Instruction.cpp Tue Jan 17 14:07:22 2006 @@ -121,6 +121,7 @@ case Shr: return "shr"; case VAArg: return "va_arg"; case ExtractElement: return "extractelement"; + case InsertElement: return "insertelement"; default: return " "; } Index: llvm/lib/VMCore/Instructions.cpp diff -u llvm/lib/VMCore/Instructions.cpp:1.30 llvm/lib/VMCore/Instructions.cpp:1.31 --- llvm/lib/VMCore/Instructions.cpp:1.30 Tue Jan 10 13:05:24 2006 +++ llvm/lib/VMCore/Instructions.cpp Tue Jan 17 14:07:22 2006 @@ -800,7 +800,7 @@ //===----------------------------------------------------------------------===// ExtractElementInst::ExtractElementInst(Value *Val, Value *Index, - const std::string &Name, Instruction *InsertBef) + const std::string &Name, Instruction *InsertBef) : Instruction(cast(Val->getType())->getElementType(), ExtractElement, Ops, 2, Name, InsertBef) { Ops[0].init(Val, this); @@ -808,7 +808,7 @@ } ExtractElementInst::ExtractElementInst(Value *Val, Value *Index, - const std::string &Name, BasicBlock *InsertAE) + const std::string &Name, BasicBlock *InsertAE) : Instruction(cast(Val->getType())->getElementType(), ExtractElement, Ops, 2, Name, InsertAE) { Ops[0].init(Val, this); @@ -816,6 +816,26 @@ } //===----------------------------------------------------------------------===// +// InsertElementInst Implementation +//===----------------------------------------------------------------------===// + +InsertElementInst::InsertElementInst(Value *Val, Value *Elt, Value *Index, + const std::string &Name, Instruction *InsertBef) + : Instruction(Val->getType(), InsertElement, Ops, 3, Name, InsertBef) { + Ops[0].init(Val, this); + Ops[1].init(Elt, this); + Ops[2].init(Index, this); +} + +InsertElementInst::InsertElementInst(Value *Val, Value *Elt, Value *Index, + const std::string &Name, BasicBlock *InsertAE) + : Instruction(Val->getType(), InsertElement, Ops, 3, Name, InsertAE) { + Ops[0].init(Val, this); + Ops[1].init(Elt, this); + Ops[2].init(Index, this); +} + +//===----------------------------------------------------------------------===// // BinaryOperator Class //===----------------------------------------------------------------------===// @@ -1176,6 +1196,7 @@ SelectInst *SelectInst::clone() const { return new SelectInst(*this); } VAArgInst *VAArgInst::clone() const { return new VAArgInst(*this); } ExtractElementInst *ExtractElementInst::clone() const {return new ExtractElementInst(*this); } +InsertElementInst *InsertElementInst::clone() const {return new InsertElementInst(*this); } PHINode *PHINode::clone() const { return new PHINode(*this); } ReturnInst *ReturnInst::clone() const { return new ReturnInst(*this); } BranchInst *BranchInst::clone() const { return new BranchInst(*this); } Index: llvm/lib/VMCore/Verifier.cpp diff -u llvm/lib/VMCore/Verifier.cpp:1.143 llvm/lib/VMCore/Verifier.cpp:1.144 --- llvm/lib/VMCore/Verifier.cpp:1.143 Mon Jan 16 15:12:35 2006 +++ llvm/lib/VMCore/Verifier.cpp Tue Jan 17 14:07:22 2006 @@ -140,7 +140,7 @@ virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); if (RealPass) - AU.addRequired(); + AU.addRequired(); } /// abortIfBroken - If the module is broken and we are supposed to abort on @@ -180,6 +180,7 @@ void visitBinaryOperator(BinaryOperator &B); void visitShiftInst(ShiftInst &SI); void visitExtractElementInst(ExtractElementInst &EI); + void visitInsertElementInst(InsertElementInst &EI); void visitVAArgInst(VAArgInst &VAA) { visitInstruction(VAA); } void visitCallInst(CallInst &CI); void visitGetElementPtrInst(GetElementPtrInst &GEP); @@ -540,10 +541,22 @@ Assert1(EI.getOperand(1)->getType() == Type::UIntTy, "Second operand to extractelement must be uint type!", &EI); Assert1(EI.getType() == - cast(EI.getOperand(0)->getType())->getElementType(), - "Extractelement return type must be same as " - "first operand element type!", &EI); + cast(EI.getOperand(0)->getType())->getElementType(), + "Extractelement return type must match " + "first operand element type!", &EI); visitInstruction(EI); +} + +void Verifier::visitInsertElementInst(InsertElementInst &IE) { + Assert1(isa(IE.getOperand(0)->getType()), + "First operand to insertelement must be packed type!", &IE); + Assert1(IE.getOperand(1)->getType() == + cast(IE.getOperand(0)->getType())->getElementType(), + "Second operand to insertelement must match " + "first operand element type!", &IE); + Assert1(IE.getOperand(2)->getType() == Type::UIntTy, + "Third operand to insertelement must be uint type!", &IE); + visitInstruction(IE); } void Verifier::visitGetElementPtrInst(GetElementPtrInst &GEP) { From jlaskey at apple.com Tue Jan 17 14:41:53 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 14:41:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200601172041.OAA11894@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.137 -> 1.138 --- Log message: Add frame work for additional dwarf sections. Comments will improve as code is added. --- Diffs of the changes: (+11 -3) PPCAsmPrinter.cpp | 14 +++++++++++--- 1 files changed, 11 insertions(+), 3 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.137 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.138 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.137 Tue Jan 17 11:31:53 2006 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Tue Jan 17 14:41:40 2006 @@ -215,9 +215,17 @@ : DwarfWriter(o, ap) { needsSet = true; - DwarfAbbrevSection = ".section __DWARF,__debug_abbrev,regular,debug"; - DwarfInfoSection = ".section __DWARF,__debug_info,regular,debug"; - DwarfLineSection = ".section __DWARF,__debug_line,regular,debug"; + DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev,regular,debug"; + DwarfInfoSection = ".section __DWARFA,__debug_info,regular,debug"; + DwarfLineSection = ".section __DWARFA,__debug_line,regular,debug"; + DwarfFrameSection = ".section __DWARFA,__debug_frame,regular,debug"; + DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames,regular,debug"; + DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes,regular,debug"; + DwarfStrSection = ".section __DWARFA,__debug_str,regular,debug"; + DwarfLocSection = ".section __DWARFA,__debug_loc,regular,debug"; + DwarfARangesSection = ".section __DWARFA,__debug_aranges,regular,debug"; + DwarfRangesSection = ".section __DWARFA,__debug_ranges,regular,debug"; + DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo,regular,debug"; TextSection = ".text"; DataSection = ".data"; } From jlaskey at apple.com Tue Jan 17 14:41:54 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 14:41:54 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200601172041.OAA11900@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.6 -> 1.7 --- Log message: Add frame work for additional dwarf sections. Comments will improve as code is added. --- Diffs of the changes: (+72 -0) DwarfWriter.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 72 insertions(+) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.6 llvm/lib/CodeGen/DwarfWriter.cpp:1.7 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.6 Tue Jan 17 11:31:53 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Tue Jan 17 14:41:40 2006 @@ -1293,6 +1293,46 @@ EmitLabel("line_end", 0); } + +/// EmitDebugFrame - Emit visible names into a debug frame section. +/// +void DwarfWriter::EmitDebugFrame() { +} + +/// EmitDebugPubNames - Emit visible names into a debug pubnames section. +/// +void DwarfWriter::EmitDebugPubNames() { +} + +/// EmitDebugPubTypes - Emit visible names into a debug pubtypes section. +/// +void DwarfWriter::EmitDebugPubTypes() { +} + +/// EmitDebugStr - Emit visible names into a debug str section. +/// +void DwarfWriter::EmitDebugStr() { +} + +/// EmitDebugLoc - Emit visible names into a debug loc section. +/// +void DwarfWriter::EmitDebugLoc() { +} + +/// EmitDebugARanges - Emit visible names into a debug aranges section. +/// +void DwarfWriter::EmitDebugARanges() { +} + +/// EmitDebugRanges - Emit visible names into a debug ranges section. +/// +void DwarfWriter::EmitDebugRanges() { +} + +/// EmitDebugMacInfo - Emit visible names into a debug macinfo section. +/// +void DwarfWriter::EmitDebugMacInfo() { +} /// ShouldEmitDwarf - Determine if Dwarf declarations should be made. /// @@ -1329,6 +1369,14 @@ , DwarfAbbrevSection(".debug_abbrev") , DwarfInfoSection(".debug_info") , DwarfLineSection(".debug_line") + , DwarfFrameSection(".debug_frame") + , DwarfPubNamesSection(".debug_pubnames") + , DwarfPubTypesSection(".debug_pubtypes") + , DwarfStrSection(".debug_str") + , DwarfLocSection(".debug_loc") + , DwarfARangesSection(".debug_aranges") + , DwarfRangesSection(".debug_ranges") + , DwarfMacInfoSection(".debug_macinfo") , TextSection(".text") , DataSection(".data") {} @@ -1377,6 +1425,30 @@ // Emit source line correspondence into a debug line section. EmitDebugLines(); + + // Emit info into a debug frame section. + EmitDebugFrame(); + + // Emit info into a debug pubnames section. + EmitDebugPubNames(); + + // Emit info into a debug pubtypes section. + EmitDebugPubTypes(); + + // Emit info into a debug str section. + EmitDebugStr(); + + // Emit info into a debug loc section. + EmitDebugLoc(); + + // Emit info into a debug aranges section. + EmitDebugARanges(); + + // Emit info into a debug ranges section. + EmitDebugRanges(); + + // Emit info into a debug macinfo section. + EmitDebugMacInfo(); } /// BeginFunction - Emit pre-function debug information. From jlaskey at apple.com Tue Jan 17 14:41:54 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 14:41:54 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601172041.OAA11898@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.8 -> 1.9 --- Log message: Add frame work for additional dwarf sections. Comments will improve as code is added. --- Diffs of the changes: (+64 -0) DwarfWriter.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 64 insertions(+) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.8 llvm/include/llvm/CodeGen/DwarfWriter.h:1.9 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.8 Tue Jan 17 13:12:24 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Tue Jan 17 14:41:40 2006 @@ -744,6 +744,38 @@ /// const char *DwarfLineSection; /// Defaults to ".debug_line". + /// DwarfFrameSection - Section directive for Dwarf info. + /// + const char *DwarfFrameSection; /// Defaults to ".debug_frame". + + /// DwarfPubNamesSection - Section directive for Dwarf info. + /// + const char *DwarfPubNamesSection; /// Defaults to ".debug_pubnames". + + /// DwarfPubTypesSection - Section directive for Dwarf info. + /// + const char *DwarfPubTypesSection; /// Defaults to ".debug_pubtypes". + + /// DwarfStrSection - Section directive for Dwarf info. + /// + const char *DwarfStrSection; /// Defaults to ".debug_str". + + /// DwarfLocSection - Section directive for Dwarf info. + /// + const char *DwarfLocSection; /// Defaults to ".debug_loc". + + /// DwarfARangesSection - Section directive for Dwarf info. + /// + const char *DwarfARangesSection; /// Defaults to ".debug_aranges". + + /// DwarfRangesSection - Section directive for Dwarf info. + /// + const char *DwarfRangesSection; /// Defaults to ".debug_ranges". + + /// DwarfMacInfoSection - Section directive for Dwarf info. + /// + const char *DwarfMacInfoSection; /// Defaults to ".debug_macinfo". + /// TextSection - Section directive for standard text. /// const char *TextSection; /// Defaults to ".text". @@ -877,6 +909,38 @@ /// void EmitDebugLines() const; + /// EmitDebugFrame - Emit info into a debug frame section. + /// + void DwarfWriter::EmitDebugFrame(); + + /// EmitDebugPubNames - Emit info into a debug pubnames section. + /// + void DwarfWriter::EmitDebugPubNames(); + + /// EmitDebugPubTypes - Emit info into a debug pubtypes section. + /// + void DwarfWriter::EmitDebugPubTypes(); + + /// EmitDebugStr - Emit info into a debug str section. + /// + void DwarfWriter::EmitDebugStr(); + + /// EmitDebugLoc - Emit info into a debug loc section. + /// + void DwarfWriter::EmitDebugLoc(); + + /// EmitDebugARanges - Emit info into a debug aranges section. + /// + void DwarfWriter::EmitDebugARanges(); + + /// EmitDebugRanges - Emit info into a debug ranges section. + /// + void DwarfWriter::EmitDebugRanges(); + + /// EmitDebugMacInfo - Emit info into a debug macinfo section. + /// + void DwarfWriter::EmitDebugMacInfo(); + /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made. /// When called it also checks to see if debug info is newly available. if /// so the initial Dwarf headers are emitted. From lattner at cs.uiuc.edu Tue Jan 17 15:31:30 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Tue, 17 Jan 2006 15:31:30 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.h Message-ID: <200601172131.PAA12521@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.h updated: 1.50 -> 1.51 --- Log message: fix a broken comment --- Diffs of the changes: (+1 -1) DAGISelEmitter.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/utils/TableGen/DAGISelEmitter.h diff -u llvm/utils/TableGen/DAGISelEmitter.h:1.50 llvm/utils/TableGen/DAGISelEmitter.h:1.51 --- llvm/utils/TableGen/DAGISelEmitter.h:1.50 Mon Jan 9 12:27:06 2006 +++ llvm/utils/TableGen/DAGISelEmitter.h Tue Jan 17 15:31:18 2006 @@ -399,7 +399,7 @@ TreePatternNode *getDstPattern() const { return DstPattern; } }; -/// InstrSelectorEmitter - The top-level class which coordinates construction +/// DAGISelEmitter - The top-level class which coordinates construction /// and emission of the instruction selector. /// class DAGISelEmitter : public TableGenBackend { From jlaskey at apple.com Tue Jan 17 15:39:51 2006 From: jlaskey at apple.com (Jim Laskey) Date: Tue, 17 Jan 2006 15:39:51 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601172139.PAA12555@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.9 -> 1.10 --- Log message: Pastos. --- Diffs of the changes: (+9 -9) DwarfWriter.h | 18 +++++++++--------- 1 files changed, 9 insertions(+), 9 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.9 llvm/include/llvm/CodeGen/DwarfWriter.h:1.10 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.9 Tue Jan 17 14:41:40 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Tue Jan 17 15:39:39 2006 @@ -839,7 +839,7 @@ /// EmitString - Emit a string with quotes and a null terminator. /// Special characters are emitted properly. (Eg. '\t') - void DwarfWriter::EmitString(const std::string &String) const; + void EmitString(const std::string &String) const; /// PrintLabelName - Print label name in form used by Dwarf writer. /// @@ -911,35 +911,35 @@ /// EmitDebugFrame - Emit info into a debug frame section. /// - void DwarfWriter::EmitDebugFrame(); + void EmitDebugFrame(); /// EmitDebugPubNames - Emit info into a debug pubnames section. /// - void DwarfWriter::EmitDebugPubNames(); + void EmitDebugPubNames(); /// EmitDebugPubTypes - Emit info into a debug pubtypes section. /// - void DwarfWriter::EmitDebugPubTypes(); + void EmitDebugPubTypes(); /// EmitDebugStr - Emit info into a debug str section. /// - void DwarfWriter::EmitDebugStr(); + void EmitDebugStr(); /// EmitDebugLoc - Emit info into a debug loc section. /// - void DwarfWriter::EmitDebugLoc(); + void EmitDebugLoc(); /// EmitDebugARanges - Emit info into a debug aranges section. /// - void DwarfWriter::EmitDebugARanges(); + void EmitDebugARanges(); /// EmitDebugRanges - Emit info into a debug ranges section. /// - void DwarfWriter::EmitDebugRanges(); + void EmitDebugRanges(); /// EmitDebugMacInfo - Emit info into a debug macinfo section. /// - void DwarfWriter::EmitDebugMacInfo(); + void EmitDebugMacInfo(); /// ShouldEmitDwarf - Returns true if Dwarf declarations should be made. /// When called it also checks to see if debug info is newly available. if From evan.cheng at apple.com Tue Jan 17 15:58:34 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Tue, 17 Jan 2006 15:58:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601172158.PAA21223@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.46 -> 1.47 --- Log message: Fix lowering of calls which return f32 values. --- Diffs of the changes: (+12 -0) X86ISelLowering.cpp | 12 ++++++++++++ 1 files changed, 12 insertions(+) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.46 llvm/lib/Target/X86/X86ISelLowering.cpp:1.47 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.46 Mon Jan 16 20:32:49 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Tue Jan 17 15:58:21 2006 @@ -548,6 +548,7 @@ Chain = Hi.getValue(1); break; } + case MVT::f32: case MVT::f64: { std::vector Tys; Tys.push_back(MVT::f64); @@ -580,6 +581,11 @@ DAG.getSrcValue(NULL)); Chain = RetVal.getValue(1); } + + if (RetTyVT == MVT::f32 && !X86ScalarSSE) + // FIXME: we would really like to remember that this FP_ROUND + // operation is okay to eliminate if we allow excess FP precision. + RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal); break; } } @@ -1068,6 +1074,7 @@ Chain = Hi.getValue(1); break; } + case MVT::f32: case MVT::f64: { std::vector Tys; Tys.push_back(MVT::f64); @@ -1100,6 +1107,11 @@ DAG.getSrcValue(NULL)); Chain = RetVal.getValue(1); } + + if (RetTyVT == MVT::f32 && !X86ScalarSSE) + // FIXME: we would really like to remember that this FP_ROUND + // operation is okay to eliminate if we allow excess FP precision. + RetVal = DAG.getNode(ISD::FP_ROUND, MVT::f32, RetVal); break; } } From criswell at cs.uiuc.edu Tue Jan 17 16:02:19 2006 From: criswell at cs.uiuc.edu (John Criswell) Date: Tue, 17 Jan 2006 16:02:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/Linker/Linker.cpp Message-ID: <200601172202.QAA15607@choi.cs.uiuc.edu> Changes in directory llvm/lib/Linker: Linker.cpp updated: 1.9 -> 1.10 --- Log message: Fixed style of curly brace. No functionality changes. --- Diffs of the changes: (+1 -2) Linker.cpp | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/lib/Linker/Linker.cpp diff -u llvm/lib/Linker/Linker.cpp:1.9 llvm/lib/Linker/Linker.cpp:1.10 --- llvm/lib/Linker/Linker.cpp:1.9 Mon Jan 9 21:12:29 2006 +++ llvm/lib/Linker/Linker.cpp Tue Jan 17 16:01:57 2006 @@ -157,8 +157,7 @@ /// Path if no matching file can be found. /// sys::Path -Linker::FindLib(const std::string &Filename) -{ +Linker::FindLib(const std::string &Filename) { // Determine if the pathname can be found as it stands. sys::Path FilePath(Filename); if (FilePath.canRead() && From evan.cheng at apple.com Wed Jan 18 02:08:50 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 02:08:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601180808.CAA08080@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.47 -> 1.48 --- Log message: If a call return type is i1, insert a truncate from X86::AL to i1. --- Diffs of the changes: (+4 -0) X86ISelLowering.cpp | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.47 llvm/lib/Target/X86/X86ISelLowering.cpp:1.48 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.47 Tue Jan 17 15:58:21 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Jan 18 02:08:38 2006 @@ -531,6 +531,8 @@ case MVT::i8: RetVal = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag); Chain = RetVal.getValue(1); + if (RetTyVT == MVT::i1) + RetVal = DAG.getNode(ISD::TRUNCATE, MVT::i1, RetVal); break; case MVT::i16: RetVal = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag); @@ -1057,6 +1059,8 @@ case MVT::i8: RetVal = DAG.getCopyFromReg(Chain, X86::AL, MVT::i8, InFlag); Chain = RetVal.getValue(1); + if (RetTyVT == MVT::i1) + RetVal = DAG.getNode(ISD::TRUNCATE, MVT::i1, RetVal); break; case MVT::i16: RetVal = DAG.getCopyFromReg(Chain, X86::AX, MVT::i16, InFlag); From evan.cheng at apple.com Wed Jan 18 03:26:58 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 03:26:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601180926.DAA05241@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.48 -> 1.49 --- Log message: SRA shift amount must be in i8 --- Diffs of the changes: (+1 -1) X86ISelLowering.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.48 llvm/lib/Target/X86/X86ISelLowering.cpp:1.49 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.48 Wed Jan 18 02:08:38 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Jan 18 03:26:46 2006 @@ -1448,7 +1448,7 @@ SDOperand ShOpHi = Op.getOperand(1); SDOperand ShAmt = Op.getOperand(2); SDOperand Tmp1 = isSRA ? DAG.getNode(ISD::SRA, MVT::i32, ShOpHi, - DAG.getConstant(31, MVT::i32)) + DAG.getConstant(31, MVT::i8)) : DAG.getConstant(0, MVT::i32); SDOperand Tmp2, Tmp3; From jlaskey at apple.com Wed Jan 18 10:54:47 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 18 Jan 2006 10:54:47 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200601181654.KAA17893@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.138 -> 1.139 --- Log message: Added minimum Dwarf aranges. Cleaned up some section headers. Line number support now works in gdb. --- Diffs of the changes: (+12 -12) PPCAsmPrinter.cpp | 24 ++++++++++++------------ 1 files changed, 12 insertions(+), 12 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.138 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.139 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.138 Tue Jan 17 14:41:40 2006 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Wed Jan 18 10:54:26 2006 @@ -215,17 +215,18 @@ : DwarfWriter(o, ap) { needsSet = true; - DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev,regular,debug"; - DwarfInfoSection = ".section __DWARFA,__debug_info,regular,debug"; - DwarfLineSection = ".section __DWARFA,__debug_line,regular,debug"; - DwarfFrameSection = ".section __DWARFA,__debug_frame,regular,debug"; - DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames,regular,debug"; - DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes,regular,debug"; - DwarfStrSection = ".section __DWARFA,__debug_str,regular,debug"; - DwarfLocSection = ".section __DWARFA,__debug_loc,regular,debug"; - DwarfARangesSection = ".section __DWARFA,__debug_aranges,regular,debug"; - DwarfRangesSection = ".section __DWARFA,__debug_ranges,regular,debug"; - DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo,regular,debug"; + DwarfAbbrevSection = ".section __DWARFA,__debug_abbrev"; + DwarfInfoSection = ".section __DWARFA,__debug_info"; + DwarfLineSection = ".section __DWARFA,__debug_line"; + DwarfFrameSection = + ".section __DWARFA,__debug_frame,,coalesced,no_toc+strip_static_syms"; + DwarfPubNamesSection = ".section __DWARFA,__debug_pubnames"; + DwarfPubTypesSection = ".section __DWARFA,__debug_pubtypes"; + DwarfStrSection = ".section __DWARFA,__debug_str"; + DwarfLocSection = ".section __DWARFA,__debug_loc"; + DwarfARangesSection = ".section __DWARFA,__debug_aranges"; + DwarfRangesSection = ".section __DWARFA,__debug_ranges"; + DwarfMacInfoSection = ".section __DWARFA,__debug_macinfo"; TextSection = ".text"; DataSection = ".data"; } @@ -233,7 +234,6 @@ /// DarwinAsmPrinter - PowerPC assembly printer, customized for Darwin/Mac OS /// X - /// struct DarwinAsmPrinter : public PPCAsmPrinter { DarwinDwarfWriter DW; From jlaskey at apple.com Wed Jan 18 10:54:47 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 18 Jan 2006 10:54:47 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601181654.KAA17894@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.10 -> 1.11 --- Log message: Added minimum Dwarf aranges. Cleaned up some section headers. Line number support now works in gdb. --- Diffs of the changes: (+6 -6) DwarfWriter.h | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.10 llvm/include/llvm/CodeGen/DwarfWriter.h:1.11 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.10 Tue Jan 17 15:39:39 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Wed Jan 18 10:54:26 2006 @@ -855,12 +855,12 @@ } void EmitLabel(const char *Tag, unsigned Number) const; - /// EmitLabelReference - Emit a reference to a label. + /// EmitReference - Emit a reference to a label. /// - void EmitLabelReference(DWLabel Label) const { - EmitLabelReference(Label.Tag, Label.Number); + void EmitReference(DWLabel Label) const { + EmitReference(Label.Tag, Label.Number); } - void EmitLabelReference(const char *Tag, unsigned Number) const; + void EmitReference(const char *Tag, unsigned Number) const; /// EmitDifference - Emit the difference between two labels. Some /// assemblers do not behave with absolute expressions with data directives, @@ -967,11 +967,11 @@ /// void EndModule(); - /// BeginFunction - Emit pre-function debug information. + /// BeginFunction - Gather pre-function debug information. /// void BeginFunction(); - /// EndFunction - Emit post-function debug information. + /// EndFunction - Gather and emit post-function debug information. /// void EndFunction(); }; From jlaskey at apple.com Wed Jan 18 10:54:47 2006 From: jlaskey at apple.com (Jim Laskey) Date: Wed, 18 Jan 2006 10:54:47 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200601181654.KAA17895@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.7 -> 1.8 --- Log message: Added minimum Dwarf aranges. Cleaned up some section headers. Line number support now works in gdb. --- Diffs of the changes: (+47 -7) DwarfWriter.cpp | 54 +++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 47 insertions(+), 7 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.7 llvm/lib/CodeGen/DwarfWriter.cpp:1.8 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.7 Tue Jan 17 14:41:40 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Wed Jan 18 10:54:26 2006 @@ -701,7 +701,7 @@ /// EmitValue - Emit label value. /// void DIELabel::EmitValue(const DwarfWriter &DW, unsigned Form) const { - DW.EmitLabelReference(Value); + DW.EmitReference(Value); } /// SizeOf - Determine size of label value in bytes. @@ -893,9 +893,9 @@ O << ":\n"; } -/// EmitLabelReference - Emit a reference to a label. +/// EmitReference - Emit a reference to a label. /// -void DwarfWriter::EmitLabelReference(const char *Tag, unsigned Number) const { +void DwarfWriter::EmitReference(const char *Tag, unsigned Number) const { if (AddressSize == 4) O << Asm->Data32bitsDirective; else @@ -1113,7 +1113,7 @@ EmitShort(DWARF_VERSION); EOL("DWARF version number"); - EmitLabelReference("abbrev", 0); EOL("Offset Into Abbrev. Section"); + EmitReference("abbrev", 0); EOL("Offset Into Abbrev. Section"); EmitByte(AddressSize); EOL("Address Size (in bytes)"); @@ -1252,7 +1252,7 @@ EmitByte(0); EOL("Extended Op"); EmitByte(4 + 1); EOL("Op size"); EmitByte(DW_LNE_set_address); EOL("DW_LNE_set_address"); - EmitLabelReference("loc", i + 1); EOL("Location label"); + EmitReference("loc", i + 1); EOL("Location label"); // If change of source, then switch to the new source. if (Source != LineInfo->getSourceID()) { @@ -1297,41 +1297,79 @@ /// EmitDebugFrame - Emit visible names into a debug frame section. /// void DwarfWriter::EmitDebugFrame() { + // FIXME - Should be per frame } /// EmitDebugPubNames - Emit visible names into a debug pubnames section. /// void DwarfWriter::EmitDebugPubNames() { + // Start the dwarf pubnames section. + Asm->SwitchSection(DwarfPubNamesSection, 0); } /// EmitDebugPubTypes - Emit visible names into a debug pubtypes section. /// void DwarfWriter::EmitDebugPubTypes() { + // Start the dwarf pubtypes section. + Asm->SwitchSection(DwarfPubTypesSection, 0); } /// EmitDebugStr - Emit visible names into a debug str section. /// void DwarfWriter::EmitDebugStr() { + // Start the dwarf str section. + Asm->SwitchSection(DwarfStrSection, 0); } /// EmitDebugLoc - Emit visible names into a debug loc section. /// void DwarfWriter::EmitDebugLoc() { + // Start the dwarf loc section. + Asm->SwitchSection(DwarfLocSection, 0); } /// EmitDebugARanges - Emit visible names into a debug aranges section. /// void DwarfWriter::EmitDebugARanges() { + // Start the dwarf aranges section. + Asm->SwitchSection(DwarfARangesSection, 0); + + // FIXME - Mock up + + // Don't include size of length + EmitLong(0x1c); EOL("Length of Address Ranges Info"); + + EmitShort(DWARF_VERSION); EOL("Dwarf Version"); + + EmitReference("info", 0); EOL("Offset of Compilation Unit Info"); + + EmitByte(AddressSize); EOL("Size of Address"); + + EmitByte(0); EOL("Size of Segment Descriptor"); + + EmitShort(0); EOL("Pad (1)"); + EmitShort(0); EOL("Pad (2)"); + + // Range 1 + EmitReference("text_begin", 0); EOL("Address"); + EmitDifference("text_end", 0, "text_begin", 0); EOL("Length"); + + EmitLong(0); EOL("EOM (1)"); + EmitLong(0); EOL("EOM (2)"); } /// EmitDebugRanges - Emit visible names into a debug ranges section. /// void DwarfWriter::EmitDebugRanges() { + // Start the dwarf ranges section. + Asm->SwitchSection(DwarfRangesSection, 0); } /// EmitDebugMacInfo - Emit visible names into a debug macinfo section. /// void DwarfWriter::EmitDebugMacInfo() { + // Start the dwarf macinfo section. + Asm->SwitchSection(DwarfMacInfoSection, 0); } /// ShouldEmitDwarf - Determine if Dwarf declarations should be made. @@ -1397,7 +1435,9 @@ EOL("Dwarf End Module"); // Standard sections final addresses. + Asm->SwitchSection(TextSection, 0); EmitLabel("text_end", 0); + Asm->SwitchSection(DataSection, 0); EmitLabel("data_end", 0); // Get directory and source information. @@ -1451,14 +1491,14 @@ EmitDebugMacInfo(); } -/// BeginFunction - Emit pre-function debug information. +/// BeginFunction - Gather pre-function debug information. /// void DwarfWriter::BeginFunction() { if (!ShouldEmitDwarf()) return; EOL("Dwarf Begin Function"); } -/// EndFunction - Emit post-function debug information. +/// EndFunction - Gather and emit post-function debug information. /// void DwarfWriter::EndFunction() { if (!ShouldEmitDwarf()) return; From lattner at cs.uiuc.edu Wed Jan 18 13:13:23 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 13:13:23 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Generic/2005-01-18-SetUO-InfLoop.ll Message-ID: <200601181913.NAA18453@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Generic: 2005-01-18-SetUO-InfLoop.ll added (r1.1) --- Log message: this testcase sent the dag combiner spinning into an infinite loop --- Diffs of the changes: (+19 -0) 2005-01-18-SetUO-InfLoop.ll | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm/test/Regression/CodeGen/Generic/2005-01-18-SetUO-InfLoop.ll diff -c /dev/null llvm/test/Regression/CodeGen/Generic/2005-01-18-SetUO-InfLoop.ll:1.1 *** /dev/null Wed Jan 18 13:13:21 2006 --- llvm/test/Regression/CodeGen/Generic/2005-01-18-SetUO-InfLoop.ll Wed Jan 18 13:13:11 2006 *************** *** 0 **** --- 1,19 ---- + ; RUN: llvm-as < %s | llc + + void %intersect_pixel() { + entry: + %tmp125 = call bool %llvm.isunordered.f64( double 0.000000e+00, double 0.000000e+00 ) ; [#uses=1] + %tmp126 = or bool %tmp125, false ; [#uses=1] + %tmp126.not = xor bool %tmp126, true ; [#uses=1] + %brmerge1 = or bool %tmp126.not, false ; [#uses=1] + br bool %brmerge1, label %bb154, label %cond_false133 + + cond_false133: ; preds = %entry + ret void + + bb154: ; preds = %entry + %tmp164 = seteq uint 0, 0 ; [#uses=0] + ret void + } + + declare bool %llvm.isunordered.f64(double, double) From lattner at cs.uiuc.edu Wed Jan 18 13:13:55 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 13:13:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200601181913.NAA18463@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.83 -> 1.84 --- Log message: Fix a backwards conditional that caused an inf loop in some cases. This fixes: test/Regression/CodeGen/Generic/2005-01-18-SetUO-InfLoop.ll --- 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.83 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.84 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.83 Sun Jan 15 12:58:59 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Jan 18 13:13:41 2006 @@ -2638,7 +2638,7 @@ return DAG.getConstant(UOF, VT); // Otherwise, we can't fold it. However, we can simplify it to SETUO/SETO // if it is not already. - ISD::CondCode NewCond = UOF == 0 ? ISD::SETUO : ISD::SETO; + ISD::CondCode NewCond = UOF == 0 ? ISD::SETO : ISD::SETUO; if (NewCond != Cond) return DAG.getSetCC(VT, N0, N1, NewCond); } From lattner at cs.uiuc.edu Wed Jan 18 13:16:18 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 13:16:18 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/2006-01-18-InvalidBranchOpcodeAssert.ll Message-ID: <200601181916.NAA18530@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: 2006-01-18-InvalidBranchOpcodeAssert.ll added (r1.1) --- Log message: new testcase --- Diffs of the changes: (+16 -0) 2006-01-18-InvalidBranchOpcodeAssert.ll | 16 ++++++++++++++++ 1 files changed, 16 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/2006-01-18-InvalidBranchOpcodeAssert.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/2006-01-18-InvalidBranchOpcodeAssert.ll:1.1 *** /dev/null Wed Jan 18 13:16:17 2006 --- llvm/test/Regression/CodeGen/PowerPC/2006-01-18-InvalidBranchOpcodeAssert.ll Wed Jan 18 13:16:07 2006 *************** *** 0 **** --- 1,16 ---- + ; RUN: llvm-as < %s | llc + ; This crashed the PPC backend. + + void %test() { + %tmp125 = call bool %llvm.isunordered.f64( double 0.000000e+00, double 0.000000e+00 ) ; [#uses=1] + br bool %tmp125, label %bb154, label %cond_false133 + + cond_false133: ; preds = %entry + ret void + + bb154: ; preds = %entry + %tmp164 = seteq uint 0, 0 ; [#uses=0] + ret void + } + + declare bool %llvm.isunordered.f64(double, double) From lattner at cs.uiuc.edu Wed Jan 18 13:35:32 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 13:35:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.h Message-ID: <200601181935.NAA21809@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.h updated: 1.7 -> 1.8 --- Log message: Fix Regression/CodeGen/PowerPC/2006-01-18-InvalidBranchOpcodeAssert.ll --- Diffs of the changes: (+2 -0) PPCInstrInfo.h | 2 ++ 1 files changed, 2 insertions(+) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.h diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.7 llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.8 --- llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.7 Sun Oct 16 00:39:50 2005 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.h Wed Jan 18 13:35:21 2006 @@ -52,6 +52,8 @@ case PPC::BGE: return PPC::BLT; case PPC::BGT: return PPC::BLE; case PPC::BLE: return PPC::BGT; + case PPC::BNU: return PPC::BUN; + case PPC::BUN: return PPC::BNU; } } }; From lattner at cs.uiuc.edu Wed Jan 18 13:37:55 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 13:37:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCInstrInfo.h Message-ID: <200601181937.NAA22343@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCInstrInfo.h updated: 1.8 -> 1.9 --- Log message: fix out of date comment --- Diffs of the changes: (+1 -1) PPCInstrInfo.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPCInstrInfo.h diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.8 llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.9 --- llvm/lib/Target/PowerPC/PPCInstrInfo.h:1.8 Wed Jan 18 13:35:21 2006 +++ llvm/lib/Target/PowerPC/PPCInstrInfo.h Wed Jan 18 13:37:44 2006 @@ -1,4 +1,4 @@ -//===- PPCInstrInfo.h - PowerPC32 Instruction Information -------*- C++ -*-===// +//===- PPCInstrInfo.h - PowerPC Instruction Information ---------*- C++ -*-===// // // The LLVM Compiler Infrastructure // From lattner at cs.uiuc.edu Wed Jan 18 13:42:47 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 13:42:47 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelLowering.cpp Message-ID: <200601181942.NAA22386@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCISelLowering.cpp updated: 1.67 -> 1.68 --- Log message: Don't assert on 'select_cc SETUO' --- Diffs of the changes: (+2 -2) PPCISelLowering.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.67 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.68 --- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.67 Sun Jan 15 03:02:48 2006 +++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Wed Jan 18 13:42:35 2006 @@ -238,7 +238,7 @@ // subtraction at all. if (isFloatingPointZero(RHS)) switch (CC) { - default: assert(0 && "Invalid FSEL condition"); abort(); + default: break; // SETUO etc aren't handled by fsel. case ISD::SETULT: case ISD::SETLT: std::swap(TV, FV); // fsel is natively setge, swap operands for setlt @@ -260,7 +260,7 @@ SDOperand Cmp; switch (CC) { - default: assert(0 && "Invalid FSEL condition"); abort(); + default: break; // SETUO etc aren't handled by fsel. case ISD::SETULT: case ISD::SETLT: Cmp = DAG.getNode(ISD::FSUB, CmpVT, LHS, RHS); From lattner at cs.uiuc.edu Wed Jan 18 15:32:57 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 15:32:57 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/CloneModule.cpp Message-ID: <200601182132.PAA24370@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: CloneModule.cpp updated: 1.14 -> 1.15 --- Log message: Make sure that cloning a module clones its target triple and dependent library list as well. This should help bugpoint. --- Diffs of the changes: (+7 -3) CloneModule.cpp | 10 +++++++--- 1 files changed, 7 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/Utils/CloneModule.cpp diff -u llvm/lib/Transforms/Utils/CloneModule.cpp:1.14 llvm/lib/Transforms/Utils/CloneModule.cpp:1.15 --- llvm/lib/Transforms/Utils/CloneModule.cpp:1.14 Wed Jul 27 01:12:34 2005 +++ llvm/lib/Transforms/Utils/CloneModule.cpp Wed Jan 18 15:32:45 2006 @@ -30,14 +30,18 @@ Module *New = new Module(M->getModuleIdentifier()); New->setEndianness(M->getEndianness()); New->setPointerSize(M->getPointerSize()); + New->setTargetTriple(M->getTargetTriple()); - // Copy all of the type symbol table entries over... + // Copy all of the type symbol table entries over. const SymbolTable &SymTab = M->getSymbolTable(); SymbolTable::type_const_iterator TypeI = SymTab.type_begin(); SymbolTable::type_const_iterator TypeE = SymTab.type_end(); - for ( ; TypeI != TypeE; ++TypeI ) { + for (; TypeI != TypeE; ++TypeI) New->addTypeName(TypeI->first, TypeI->second); - } + + // Copy all of the dependent libraries over. + for (Module::lib_iterator I = M->lib_begin(), E = M->lib_end(); I != E; ++I) + New->addLibrary(*I); // Create the value map that maps things from the old module over to the new // module. From lattner at cs.uiuc.edu Wed Jan 18 15:50:26 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 15:50:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Message-ID: <200601182150.PAA24671@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: SelectionDAGISel.cpp updated: 1.127 -> 1.128 --- Log message: Temporary work around for a libcall insertion bug: If a target doesn't support FSIN/FCOS nodes, do not lower sin/cos to them. --- Diffs of the changes: (+6 -2) SelectionDAGISel.cpp | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.127 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.128 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.127 Tue Jan 17 14:06:42 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Wed Jan 18 15:50:14 2006 @@ -1070,7 +1070,9 @@ } else if (Name[0] == 's' && (Name == "sin" || Name == "sinf")) { if (I.getNumOperands() == 2 && // Basic sanity checks. I.getOperand(1)->getType()->isFloatingPoint() && - I.getType() == I.getOperand(1)->getType()) { + I.getType() == I.getOperand(1)->getType() && + TLI.isOperationLegal(ISD::FSIN, + TLI.getValueType(I.getOperand(1)->getType()))) { SDOperand Tmp = getValue(I.getOperand(1)); setValue(&I, DAG.getNode(ISD::FSIN, Tmp.getValueType(), Tmp)); return; @@ -1078,7 +1080,9 @@ } else if (Name[0] == 'c' && (Name == "cos" || Name == "cosf")) { if (I.getNumOperands() == 2 && // Basic sanity checks. I.getOperand(1)->getType()->isFloatingPoint() && - I.getType() == I.getOperand(1)->getType()) { + I.getType() == I.getOperand(1)->getType() && + TLI.isOperationLegal(ISD::FCOS, + TLI.getValueType(I.getOperand(1)->getType()))) { SDOperand Tmp = getValue(I.getOperand(1)); setValue(&I, DAG.getNode(ISD::FCOS, Tmp.getValueType(), Tmp)); return; From natebegeman at mac.com Wed Jan 18 16:35:27 2006 From: natebegeman at mac.com (Nate Begeman) Date: Wed, 18 Jan 2006 16:35:27 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Message-ID: <200601182235.QAA24894@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: DAGCombiner.cpp updated: 1.84 -> 1.85 --- Log message: Get rid of code in the DAGCombiner that is duplicated in SelectionDAG.cpp Now all constant folding in the code generator is in one place. --- Diffs of the changes: (+80 -74) DAGCombiner.cpp | 154 +++++++++++++++++++++++++++++--------------------------- 1 files changed, 80 insertions(+), 74 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp diff -u llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.84 llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.85 --- llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp:1.84 Wed Jan 18 13:13:41 2006 +++ llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp Wed Jan 18 16:35:16 2006 @@ -678,7 +678,7 @@ // fold (add c1, c2) -> c1+c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() + N1C->getValue(), VT); + return DAG.getNode(ISD::ADD, VT, N0, N1); // canonicalize constant to RHS if (N0C && !N1C) return DAG.getNode(ISD::ADD, VT, N1, N0); @@ -723,20 +723,17 @@ SDOperand N1 = N->getOperand(1); ConstantSDNode *N0C = dyn_cast(N0.Val); ConstantSDNode *N1C = dyn_cast(N1.Val); + MVT::ValueType VT = N0.getValueType(); // fold (sub x, x) -> 0 if (N0 == N1) return DAG.getConstant(0, N->getValueType(0)); - // fold (sub c1, c2) -> c1-c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() - N1C->getValue(), - N->getValueType(0)); + return DAG.getNode(ISD::SUB, VT, N0, N1); // fold (sub x, c) -> (add x, -c) if (N1C) - return DAG.getNode(ISD::ADD, N0.getValueType(), N0, - DAG.getConstant(-N1C->getValue(), N0.getValueType())); - + return DAG.getNode(ISD::ADD, VT, N0, DAG.getConstant(-N1C->getValue(), VT)); // fold (A+B)-A -> B if (N0.getOpcode() == ISD::ADD && N0.getOperand(0) == N1) return N0.getOperand(1); @@ -755,7 +752,7 @@ // fold (mul c1, c2) -> c1*c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() * N1C->getValue(), VT); + return DAG.getNode(ISD::MUL, VT, N0, N1); // canonicalize constant to RHS if (N0C && !N1C) return DAG.getNode(ISD::MUL, VT, N1, N0); @@ -798,14 +795,13 @@ SDOperand DAGCombiner::visitSDIV(SDNode *N) { SDOperand N0 = N->getOperand(0); SDOperand N1 = N->getOperand(1); - MVT::ValueType VT = N->getValueType(0); ConstantSDNode *N0C = dyn_cast(N0.Val); ConstantSDNode *N1C = dyn_cast(N1.Val); + MVT::ValueType VT = N->getValueType(0); // fold (sdiv c1, c2) -> c1/c2 if (N0C && N1C && !N1C->isNullValue()) - return DAG.getConstant(N0C->getSignExtended() / N1C->getSignExtended(), - N->getValueType(0)); + return DAG.getNode(ISD::SDIV, VT, N0, N1); // fold (sdiv X, 1) -> X if (N1C && N1C->getSignExtended() == 1LL) return N0; @@ -857,14 +853,13 @@ SDOperand DAGCombiner::visitUDIV(SDNode *N) { SDOperand N0 = N->getOperand(0); SDOperand N1 = N->getOperand(1); - MVT::ValueType VT = N->getValueType(0); ConstantSDNode *N0C = dyn_cast(N0.Val); ConstantSDNode *N1C = dyn_cast(N1.Val); + MVT::ValueType VT = N->getValueType(0); // fold (udiv c1, c2) -> c1/c2 if (N0C && N1C && !N1C->isNullValue()) - return DAG.getConstant(N0C->getValue() / N1C->getValue(), - N->getValueType(0)); + return DAG.getNode(ISD::UDIV, VT, N0, N1); // fold (udiv x, (1 << c)) -> x >>u c if (N1C && isPowerOf2_64(N1C->getValue())) return DAG.getNode(ISD::SRL, N->getValueType(0), N0, @@ -882,20 +877,19 @@ SDOperand DAGCombiner::visitSREM(SDNode *N) { SDOperand N0 = N->getOperand(0); SDOperand N1 = N->getOperand(1); - MVT::ValueType VT = N->getValueType(0); ConstantSDNode *N0C = dyn_cast(N0); ConstantSDNode *N1C = dyn_cast(N1); + MVT::ValueType VT = N->getValueType(0); // fold (srem c1, c2) -> c1%c2 if (N0C && N1C && !N1C->isNullValue()) - return DAG.getConstant(N0C->getSignExtended() % N1C->getSignExtended(), - N->getValueType(0)); + return DAG.getNode(ISD::SREM, VT, N0, N1); // If we know the sign bits of both operands are zero, strength reduce to a // urem instead. Handles (X & 0x0FFFFFFF) %s 16 -> X&15 uint64_t SignBit = 1ULL << (MVT::getSizeInBits(VT)-1); if (MaskedValueIsZero(N1, SignBit, TLI) && MaskedValueIsZero(N0, SignBit, TLI)) - return DAG.getNode(ISD::UREM, N1.getValueType(), N0, N1); + return DAG.getNode(ISD::UREM, VT, N0, N1); return SDOperand(); } @@ -904,15 +898,14 @@ SDOperand N1 = N->getOperand(1); ConstantSDNode *N0C = dyn_cast(N0); ConstantSDNode *N1C = dyn_cast(N1); + MVT::ValueType VT = N->getValueType(0); // fold (urem c1, c2) -> c1%c2 if (N0C && N1C && !N1C->isNullValue()) - return DAG.getConstant(N0C->getValue() % N1C->getValue(), - N->getValueType(0)); + return DAG.getNode(ISD::UREM, VT, N0, N1); // fold (urem x, pow2) -> (and x, pow2-1) if (N1C && !N1C->isNullValue() && isPowerOf2_64(N1C->getValue())) - return DAG.getNode(ISD::AND, N0.getValueType(), N0, - DAG.getConstant(N1C->getValue()-1, N1.getValueType())); + return DAG.getNode(ISD::AND, VT, N0, DAG.getConstant(N1C->getValue()-1,VT)); return SDOperand(); } @@ -957,7 +950,7 @@ // fold (and c1, c2) -> c1&c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() & N1C->getValue(), VT); + return DAG.getNode(ISD::AND, VT, N0, N1); // canonicalize constant to RHS if (N0C && !N1C) return DAG.getNode(ISD::AND, VT, N1, N0); @@ -1108,8 +1101,7 @@ // fold (or c1, c2) -> c1|c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() | N1C->getValue(), - N->getValueType(0)); + return DAG.getNode(ISD::OR, VT, N0, N1); // canonicalize constant to RHS if (N0C && !N1C) return DAG.getNode(ISD::OR, VT, N1, N0); @@ -1235,7 +1227,7 @@ // fold (xor c1, c2) -> c1^c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() ^ N1C->getValue(), VT); + return DAG.getNode(ISD::XOR, VT, N0, N1); // canonicalize constant to RHS if (N0C && !N1C) return DAG.getNode(ISD::XOR, VT, N1, N0); @@ -1314,7 +1306,7 @@ // fold (shl c1, c2) -> c1<getValue() << N1C->getValue(), VT); + return DAG.getNode(ISD::SHL, VT, N0, N1); // fold (shl 0, x) -> 0 if (N0C && N0C->isNullValue()) return N0; @@ -1369,7 +1361,7 @@ // fold (sra c1, c2) -> c1>>c2 if (N0C && N1C) - return DAG.getConstant(N0C->getSignExtended() >> N1C->getValue(), VT); + return DAG.getNode(ISD::SRA, VT, N0, N1); // fold (sra 0, x) -> 0 if (N0C && N0C->isNullValue()) return N0; @@ -1398,7 +1390,7 @@ // fold (srl c1, c2) -> c1 >>u c2 if (N0C && N1C) - return DAG.getConstant(N0C->getValue() >> N1C->getValue(), VT); + return DAG.getNode(ISD::SRL, VT, N0, N1); // fold (srl 0, x) -> 0 if (N0C && N0C->isNullValue()) return N0; @@ -1427,33 +1419,33 @@ SDOperand DAGCombiner::visitCTLZ(SDNode *N) { SDOperand N0 = N->getOperand(0); ConstantSDNode *N0C = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (ctlz c1) -> c2 if (N0C) - return DAG.getConstant(CountLeadingZeros_64(N0C->getValue()), - N0.getValueType()); + return DAG.getNode(ISD::CTLZ, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitCTTZ(SDNode *N) { SDOperand N0 = N->getOperand(0); ConstantSDNode *N0C = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (cttz c1) -> c2 if (N0C) - return DAG.getConstant(CountTrailingZeros_64(N0C->getValue()), - N0.getValueType()); + return DAG.getNode(ISD::CTTZ, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitCTPOP(SDNode *N) { SDOperand N0 = N->getOperand(0); ConstantSDNode *N0C = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (ctpop c1) -> c2 if (N0C) - return DAG.getConstant(CountPopulation_64(N0C->getValue()), - N0.getValueType()); + return DAG.getNode(ISD::CTPOP, VT, N0); return SDOperand(); } @@ -1591,7 +1583,7 @@ // fold (sext c1) -> c1 if (N0C) - return DAG.getConstant(N0C->getSignExtended(), VT); + return DAG.getNode(ISD::SIGN_EXTEND, VT, N0); // fold (sext (sext x)) -> (sext x) if (N0.getOpcode() == ISD::SIGN_EXTEND) return DAG.getNode(ISD::SIGN_EXTEND, VT, N0.getOperand(0)); @@ -1636,7 +1628,7 @@ // fold (zext c1) -> c1 if (N0C) - return DAG.getConstant(N0C->getValue(), VT); + return DAG.getNode(ISD::ZERO_EXTEND, VT, N0); // fold (zext (zext x)) -> (zext x) if (N0.getOpcode() == ISD::ZERO_EXTEND) return DAG.getNode(ISD::ZERO_EXTEND, VT, N0.getOperand(0)); @@ -1755,7 +1747,7 @@ return N0; // fold (truncate c1) -> c1 if (N0C) - return DAG.getConstant(N0C->getValue(), VT); + return DAG.getNode(ISD::TRUNCATE, VT, N0); // fold (truncate (truncate x)) -> (truncate x) if (N0.getOpcode() == ISD::TRUNCATE) return DAG.getNode(ISD::TRUNCATE, VT, N0.getOperand(0)); @@ -1831,7 +1823,7 @@ // fold (fadd c1, c2) -> c1+c2 if (N0CFP && N1CFP) - return DAG.getConstantFP(N0CFP->getValue() + N1CFP->getValue(), VT); + return DAG.getNode(ISD::FADD, VT, N0, N1); // canonicalize constant to RHS if (N0CFP && !N1CFP) return DAG.getNode(ISD::FADD, VT, N1, N0); @@ -1853,10 +1845,10 @@ // fold (fsub c1, c2) -> c1-c2 if (N0CFP && N1CFP) - return DAG.getConstantFP(N0CFP->getValue() - N1CFP->getValue(), VT); + return DAG.getNode(ISD::FSUB, VT, N0, N1); // fold (A-(-B)) -> A+B if (N1.getOpcode() == ISD::FNEG) - return DAG.getNode(ISD::FADD, N0.getValueType(), N0, N1.getOperand(0)); + return DAG.getNode(ISD::FADD, VT, N0, N1.getOperand(0)); return SDOperand(); } @@ -1869,7 +1861,7 @@ // fold (fmul c1, c2) -> c1*c2 if (N0CFP && N1CFP) - return DAG.getConstantFP(N0CFP->getValue() * N1CFP->getValue(), VT); + return DAG.getNode(ISD::FMUL, VT, N0, N1); // canonicalize constant to RHS if (N0CFP && !N1CFP) return DAG.getNode(ISD::FMUL, VT, N1, N0); @@ -1882,26 +1874,26 @@ SDOperand DAGCombiner::visitFDIV(SDNode *N) { SDOperand N0 = N->getOperand(0); SDOperand N1 = N->getOperand(1); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + ConstantFPSDNode *N1CFP = dyn_cast(N1); MVT::ValueType VT = N->getValueType(0); - if (ConstantFPSDNode *N0CFP = dyn_cast(N0)) - if (ConstantFPSDNode *N1CFP = dyn_cast(N1)) { - // fold floating point (fdiv c1, c2) - return DAG.getConstantFP(N0CFP->getValue() / N1CFP->getValue(), VT); - } + // fold (fdiv c1, c2) -> c1/c2 + if (N0CFP && N1CFP) + return DAG.getNode(ISD::FDIV, VT, N0, N1); return SDOperand(); } SDOperand DAGCombiner::visitFREM(SDNode *N) { SDOperand N0 = N->getOperand(0); SDOperand N1 = N->getOperand(1); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + ConstantFPSDNode *N1CFP = dyn_cast(N1); MVT::ValueType VT = N->getValueType(0); - if (ConstantFPSDNode *N0CFP = dyn_cast(N0)) - if (ConstantFPSDNode *N1CFP = dyn_cast(N1)) { - // fold floating point (frem c1, c2) -> fmod(c1, c2) - return DAG.getConstantFP(fmod(N0CFP->getValue(),N1CFP->getValue()), VT); - } + // fold (frem c1, c2) -> fmod(c1,c2) + if (N0CFP && N1CFP) + return DAG.getNode(ISD::FREM, VT, N0, N1); return SDOperand(); } @@ -1909,47 +1901,55 @@ SDOperand DAGCombiner::visitSINT_TO_FP(SDNode *N) { SDOperand N0 = N->getOperand(0); ConstantSDNode *N0C = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (sint_to_fp c1) -> c1fp if (N0C) - return DAG.getConstantFP(N0C->getSignExtended(), N->getValueType(0)); + return DAG.getNode(ISD::SINT_TO_FP, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitUINT_TO_FP(SDNode *N) { SDOperand N0 = N->getOperand(0); ConstantSDNode *N0C = dyn_cast(N0); - + MVT::ValueType VT = N->getValueType(0); + // fold (uint_to_fp c1) -> c1fp if (N0C) - return DAG.getConstantFP(N0C->getValue(), N->getValueType(0)); + return DAG.getNode(ISD::UINT_TO_FP, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitFP_TO_SINT(SDNode *N) { - ConstantFPSDNode *N0CFP = dyn_cast(N->getOperand(0)); + SDOperand N0 = N->getOperand(0); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (fp_to_sint c1fp) -> c1 if (N0CFP) - return DAG.getConstant((int64_t)N0CFP->getValue(), N->getValueType(0)); + return DAG.getNode(ISD::FP_TO_SINT, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitFP_TO_UINT(SDNode *N) { - ConstantFPSDNode *N0CFP = dyn_cast(N->getOperand(0)); + SDOperand N0 = N->getOperand(0); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (fp_to_uint c1fp) -> c1 if (N0CFP) - return DAG.getConstant((uint64_t)N0CFP->getValue(), N->getValueType(0)); + return DAG.getNode(ISD::FP_TO_UINT, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitFP_ROUND(SDNode *N) { - ConstantFPSDNode *N0CFP = dyn_cast(N->getOperand(0)); + SDOperand N0 = N->getOperand(0); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (fp_round c1fp) -> c1fp if (N0CFP) - return DAG.getConstantFP(N0CFP->getValue(), N->getValueType(0)); + return DAG.getNode(ISD::FP_ROUND, VT, N0); return SDOperand(); } @@ -1968,41 +1968,47 @@ } SDOperand DAGCombiner::visitFP_EXTEND(SDNode *N) { - ConstantFPSDNode *N0CFP = dyn_cast(N->getOperand(0)); + SDOperand N0 = N->getOperand(0); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); // fold (fp_extend c1fp) -> c1fp if (N0CFP) - return DAG.getConstantFP(N0CFP->getValue(), N->getValueType(0)); + return DAG.getNode(ISD::FP_EXTEND, VT, N0); return SDOperand(); } SDOperand DAGCombiner::visitFNEG(SDNode *N) { - ConstantFPSDNode *N0CFP = dyn_cast(N->getOperand(0)); - // fold (neg c1) -> -c1 + SDOperand N0 = N->getOperand(0); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); + + // fold (fneg c1) -> -c1 if (N0CFP) - return DAG.getConstantFP(-N0CFP->getValue(), N->getValueType(0)); - // fold (neg (sub x, y)) -> (sub y, x) + return DAG.getNode(ISD::FNEG, VT, N0); + // fold (fneg (sub x, y)) -> (sub y, x) if (N->getOperand(0).getOpcode() == ISD::SUB) - return DAG.getNode(ISD::SUB, N->getValueType(0), N->getOperand(1), - N->getOperand(0)); - // fold (neg (neg x)) -> x + return DAG.getNode(ISD::SUB, VT, N->getOperand(1), N->getOperand(0)); + // fold (fneg (fneg x)) -> x if (N->getOperand(0).getOpcode() == ISD::FNEG) return N->getOperand(0).getOperand(0); return SDOperand(); } SDOperand DAGCombiner::visitFABS(SDNode *N) { - ConstantFPSDNode *N0CFP = dyn_cast(N->getOperand(0)); + SDOperand N0 = N->getOperand(0); + ConstantFPSDNode *N0CFP = dyn_cast(N0); + MVT::ValueType VT = N->getValueType(0); + // fold (fabs c1) -> fabs(c1) if (N0CFP) - return DAG.getConstantFP(fabs(N0CFP->getValue()), N->getValueType(0)); + return DAG.getNode(ISD::FABS, VT, N0); // fold (fabs (fabs x)) -> (fabs x) if (N->getOperand(0).getOpcode() == ISD::FABS) return N->getOperand(0); // fold (fabs (fneg x)) -> (fabs x) if (N->getOperand(0).getOpcode() == ISD::FNEG) - return DAG.getNode(ISD::FABS, N->getValueType(0), - N->getOperand(0).getOperand(0)); + return DAG.getNode(ISD::FABS, VT, N->getOperand(0).getOperand(0)); return SDOperand(); } From alenhar2 at cs.uiuc.edu Wed Jan 18 16:59:45 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 18 Jan 2006 16:59:45 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/Alpha/2006-01-18-MissedGlobal.ll Message-ID: <200601182259.QAA25252@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/Alpha: 2006-01-18-MissedGlobal.ll added (r1.1) --- Log message: a reduced test case, the GlobalAddress is never legalized --- Diffs of the changes: (+30 -0) 2006-01-18-MissedGlobal.ll | 30 ++++++++++++++++++++++++++++++ 1 files changed, 30 insertions(+) Index: llvm/test/Regression/CodeGen/Alpha/2006-01-18-MissedGlobal.ll diff -c /dev/null llvm/test/Regression/CodeGen/Alpha/2006-01-18-MissedGlobal.ll:1.1 *** /dev/null Wed Jan 18 16:59:43 2006 --- llvm/test/Regression/CodeGen/Alpha/2006-01-18-MissedGlobal.ll Wed Jan 18 16:59:33 2006 *************** *** 0 **** --- 1,30 ---- + ; The global symbol should be legalized + ; RUN: llvm-as < %s | llc -march=alpha + + target endian = little + target pointersize = 64 + %struct.LIST_HELP = type { %struct.LIST_HELP*, sbyte* } + %struct._IO_FILE = type { int, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, sbyte*, %struct._IO_marker*, %struct._IO_FILE*, int, int, long, ushort, sbyte, [1 x sbyte], sbyte*, long, sbyte*, sbyte*, int, [44 x sbyte] } + %struct._IO_marker = type { %struct._IO_marker*, %struct._IO_FILE*, int } + %clause_SORT = external global [21 x %struct.LIST_HELP*] ; <[21 x %struct.LIST_HELP*]*> [#uses=1] + %ia_in = external global %struct._IO_FILE* ; <%struct._IO_FILE**> [#uses=1] + %multvec_j = external global [100 x uint] ; <[100 x uint]*> [#uses=1] + + implementation ; Functions: + + void %main(int %argc) { + clock_Init.exit: + %tmp.5.i575 = load int* null ; [#uses=1] + %tmp.309 = seteq int %tmp.5.i575, 0 ; [#uses=1] + br bool %tmp.309, label %UnifiedReturnBlock, label %then.17 + + then.17: ; preds = %clock_Init.exit + store %struct._IO_FILE* null, %struct._IO_FILE** %ia_in + %savedstack = call sbyte* %llvm.stacksave( ) ; [#uses=0] + ret void + + UnifiedReturnBlock: ; preds = %clock_Init.exit + ret void + } + + declare sbyte* %llvm.stacksave() From alenhar2 at cs.uiuc.edu Wed Jan 18 17:19:20 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Wed, 18 Jan 2006 17:19:20 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601182319.RAA25524@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.269 -> 1.270 --- Log message: was ignoring the legalized chain in this case, fixed SPASS on alpha --- 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.269 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.270 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.269 Tue Jan 17 13:47:13 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Jan 18 17:19:08 2006 @@ -1469,7 +1469,7 @@ // Expand to CopyFromReg if the target set // StackPointerRegisterToSaveRestore. if (unsigned SP = TLI.getStackPointerRegisterToSaveRestore()) { - Tmp1 = DAG.getCopyFromReg(Node->getOperand(0), SP, + Tmp1 = DAG.getCopyFromReg(Tmp1, SP, Node->getValueType(0)); AddLegalizedOperand(SDOperand(Node, 0), Tmp1); AddLegalizedOperand(SDOperand(Node, 1), Tmp1.getValue(1)); From lattner at cs.uiuc.edu Wed Jan 18 18:40:51 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 18:40:51 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/Internalize.cpp Message-ID: <200601190040.SAA26096@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: Internalize.cpp updated: 1.28 -> 1.29 --- Log message: Don't internalize llvm.global[cd]tor unless there are uses of it. This unbreaks front-ends that don't use __main (like the new CFE). --- Diffs of the changes: (+9 -3) Internalize.cpp | 12 +++++++++--- 1 files changed, 9 insertions(+), 3 deletions(-) Index: llvm/lib/Transforms/IPO/Internalize.cpp diff -u llvm/lib/Transforms/IPO/Internalize.cpp:1.28 llvm/lib/Transforms/IPO/Internalize.cpp:1.29 --- llvm/lib/Transforms/IPO/Internalize.cpp:1.28 Tue Jan 3 13:13:17 2006 +++ llvm/lib/Transforms/IPO/Internalize.cpp Wed Jan 18 18:40:39 2006 @@ -109,7 +109,7 @@ // Never internalize the llvm.used symbol. It is used to implement // attribute((used)). ExternalNames.insert("llvm.used"); - + // Never internalize anchors used by the debugger, else the debugger won't // find them. ExternalNames.insert("llvm.dbg.translation_units"); @@ -125,13 +125,19 @@ // the list if it's empty. // if (I->hasAppendingLinkage() && (I->getName() == "llvm.global_ctors" || - I->getName() == "llvm.global_dtors")) + I->getName() == "llvm.global_dtors")) { I->setConstant(true); + + // If the global ctors/dtors list has no uses, do not internalize it, as + // there is no __main in this program, so the asmprinter should handle + // it. + if (I->use_empty()) continue; + } I->setLinkage(GlobalValue::InternalLinkage); Changed = true; ++NumGlobals; - DEBUG(std::cerr << "Internalizing gvar " << I->getName() << "\n"); + DEBUG(std::cerr << "Internalized gvar " << I->getName() << "\n"); } return Changed; From lattner at cs.uiuc.edu Wed Jan 18 18:47:05 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 18:47:05 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/Internalize.cpp Message-ID: <200601190047.SAA26143@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: Internalize.cpp updated: 1.29 -> 1.30 --- Log message: If not internalizing, don't mark llvm.global[cd]tors const, as a fix for a hypothetical future boog. --- Diffs of the changes: (+5 -2) Internalize.cpp | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/IPO/Internalize.cpp diff -u llvm/lib/Transforms/IPO/Internalize.cpp:1.29 llvm/lib/Transforms/IPO/Internalize.cpp:1.30 --- llvm/lib/Transforms/IPO/Internalize.cpp:1.29 Wed Jan 18 18:40:39 2006 +++ llvm/lib/Transforms/IPO/Internalize.cpp Wed Jan 18 18:46:54 2006 @@ -126,12 +126,15 @@ // if (I->hasAppendingLinkage() && (I->getName() == "llvm.global_ctors" || I->getName() == "llvm.global_dtors")) { - I->setConstant(true); - // If the global ctors/dtors list has no uses, do not internalize it, as // there is no __main in this program, so the asmprinter should handle // it. if (I->use_empty()) continue; + + // Otherwise, also mark the list constant, as we know that it will not + // be mutated any longer, and the makes simple IPO xforms automatically + // better. + I->setConstant(true); } I->setLinkage(GlobalValue::InternalLinkage); From reid at x10sys.com Wed Jan 18 19:17:18 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 19:17:18 -0600 Subject: [llvm-commits] CVS: llvm/test/Feature/intrinsics.ll Message-ID: <200601190117.TAA26322@zion.cs.uiuc.edu> Changes in directory llvm/test/Feature: intrinsics.ll updated: 1.10 -> 1.11 --- Log message: Expand test to cover the non-overloaded variants of the arithmetic and floating point intrinsics. --- Diffs of the changes: (+45 -1) intrinsics.ll | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 45 insertions(+), 1 deletion(-) Index: llvm/test/Feature/intrinsics.ll diff -u llvm/test/Feature/intrinsics.ll:1.10 llvm/test/Feature/intrinsics.ll:1.11 --- llvm/test/Feature/intrinsics.ll:1.10 Sun May 8 23:47:32 2005 +++ llvm/test/Feature/intrinsics.ll Wed Jan 18 19:17:06 2006 @@ -5,12 +5,33 @@ declare bool %llvm.isunordered(float, float) declare bool %llvm.isunordered(double, double) +declare bool %llvm.isunordered.f32(float,float) +declare bool %llvm.isunordered.f64(double,double) declare void %llvm.prefetch(sbyte*, uint, uint) declare uint %llvm.ctpop(uint) +declare ubyte %llvm.ctpop.i8(ubyte) +declare ushort %llvm.ctpop.i16(ushort) +declare uint %llvm.ctpop.i32(uint) +declare ulong %llvm.ctpop.i64(ulong) + declare ushort %llvm.cttz(ushort) +declare ubyte %llvm.cttz.i8(ubyte) +declare ushort %llvm.cttz.i16(ushort) +declare uint %llvm.cttz.i32(uint) +declare ulong %llvm.cttz.i64(ulong) + declare ulong %llvm.ctlz(ulong) +declare ubyte %llvm.ctlz.i8(ubyte) +declare ushort %llvm.ctlz.i16(ushort) +declare uint %llvm.ctlz.i32(uint) +declare ulong %llvm.ctlz.i64(ulong) + +declare float %llvm.sqrt(float) +declare double %llvm.sqrt(double) +declare float %llvm.sqrt.f32(float) +declare double %llvm.sqrt.f64(double) implementation @@ -19,10 +40,33 @@ void %libm() { call bool %llvm.isunordered(float 0.0, float 1.0) call bool %llvm.isunordered(double 0.0, double 0x7FF8000000000000) + call bool %llvm.isunordered.f32(float 1.0, float 2.0) + call bool %llvm.isunordered.f64(double 3.0, double 4.0) + call void %llvm.prefetch(sbyte* null, uint 1, uint 3) + + call float %llvm.sqrt(float 4.0) + call double %llvm.sqrt(double 4.0) + call float %llvm.sqrt.f32(float 5.0) + call double %llvm.sqrt.f64(double 6.0) + call uint %llvm.ctpop(uint 3) - call ushort %llvm.cttz(ushort 7) + call ubyte %llvm.ctpop.i8(ubyte 10) + call ushort %llvm.ctpop.i16(ushort 11) + call uint %llvm.ctpop.i32(uint 12) + call ulong %llvm.ctpop.i64(ulong 13) + call ulong %llvm.ctlz(ulong 65000) + call ubyte %llvm.ctlz.i8(ubyte 14) + call ushort %llvm.ctlz.i16(ushort 15) + call uint %llvm.ctlz.i32(uint 16) + call ulong %llvm.ctlz.i64(ulong 17) + + call ushort %llvm.cttz(ushort 7) + call ubyte %llvm.cttz.i8(ubyte 18) + call ushort %llvm.cttz.i16(ushort 19) + call uint %llvm.cttz.i32(uint 20) + call ulong %llvm.cttz.i64(ulong 21) ret void } From reid at x10sys.com Wed Jan 18 19:18:42 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 19:18:42 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Assembly/AutoUpgrade.h Message-ID: <200601190118.TAA26344@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Assembly: AutoUpgrade.h updated: 1.1 -> 1.2 --- Log message: Add a new interface function to AutoUpgrade for simultaneously upgrading the Function and the CallInst: UpgradeCallsToIntrinsic(Function*). Also, re-factor the AutoUpgrade implementation to eliminate some duplication of code. --- Diffs of the changes: (+25 -1) AutoUpgrade.h | 26 +++++++++++++++++++++++++- 1 files changed, 25 insertions(+), 1 deletion(-) Index: llvm/include/llvm/Assembly/AutoUpgrade.h diff -u llvm/include/llvm/Assembly/AutoUpgrade.h:1.1 llvm/include/llvm/Assembly/AutoUpgrade.h:1.2 --- llvm/include/llvm/Assembly/AutoUpgrade.h:1.1 Mon Jan 16 15:06:01 2006 +++ llvm/include/llvm/Assembly/AutoUpgrade.h Wed Jan 18 19:18:29 2006 @@ -14,8 +14,17 @@ #ifndef LLVM_ASSEMBLY_AUTOUPGRADE_H #define LLVM_ASSEMBLY_AUTOUPGRADE_H +#include + namespace llvm { class Function; + class CallInst; + + /// This function determines if the \p Name provides is a name for which the + /// auto-upgrade to a non-overloaded name applies. + /// @returns True if the function name is upgradeable, false otherwise. + /// @brief Determine if a name is an upgradeable intrinsic name. + bool IsUpgradeableIntrinsicName(const std::string& Name); /// This function inspects the Function \p F to see if it is an old overloaded /// intrinsic. If it is, the Function's name is changed to add a suffix that @@ -25,8 +34,23 @@ /// the auto-upgrade feature from the old overloaded names to the new /// non-overloaded names. /// @param F The Function to potentially auto-upgrade. + /// @returns A corrected version of F, or 0 if no change necessary /// @brief Remove overloaded intrinsic function names. - bool UpgradeIntrinsicFunction(Function* F); + Function* UpgradeIntrinsicFunction(Function* F); + + /// This function inspects the CallInst \p CI to see if it is a call to an + /// old overloaded intrinsic. If it is, the CallInst's name is changed to add + /// a suffix that indicates the kind of arguments or result that it accepts. + /// In LLVM 1.7, the overloading of intrinsic functions was replaced with + /// separate functions for each of the various argument sizes. This function + /// implements the auto-upgrade feature from old overloaded names to the new + /// non-overloaded names. + /// @param CI The CallInst to potentially auto-upgrade. + /// @returns True if the call was upgraded, false otherwise. + /// @brief Replace overloaded intrinsic function calls. + CallInst* UpgradeIntrinsicCall(CallInst* CI); + + bool UpgradeCallsToIntrinsic(Function* F); } // End llvm namespace From reid at x10sys.com Wed Jan 18 19:18:42 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 19:18:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp Message-ID: <200601190118.TAA26340@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AutoUpgrade.cpp updated: 1.1 -> 1.2 --- Log message: Add a new interface function to AutoUpgrade for simultaneously upgrading the Function and the CallInst: UpgradeCallsToIntrinsic(Function*). Also, re-factor the AutoUpgrade implementation to eliminate some duplication of code. --- Diffs of the changes: (+150 -59) AutoUpgrade.cpp | 209 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 150 insertions(+), 59 deletions(-) Index: llvm/lib/VMCore/AutoUpgrade.cpp diff -u llvm/lib/VMCore/AutoUpgrade.cpp:1.1 llvm/lib/VMCore/AutoUpgrade.cpp:1.2 --- llvm/lib/VMCore/AutoUpgrade.cpp:1.1 Mon Jan 16 15:06:01 2006 +++ llvm/lib/VMCore/AutoUpgrade.cpp Wed Jan 18 19:18:29 2006 @@ -12,16 +12,37 @@ //===----------------------------------------------------------------------===// #include "llvm/Assembly/AutoUpgrade.h" +#include "llvm/DerivedTypes.h" #include "llvm/Function.h" -#include "llvm/Type.h" +#include "llvm/Module.h" +#include "llvm/Instructions.h" +#include "llvm/Intrinsics.h" +#include "llvm/SymbolTable.h" #include using namespace llvm; -// UpgradeIntrinsicFunction - Convert overloaded intrinsic function names to -// their non-overloaded variants by appending the appropriate suffix based on -// the argument types. -bool llvm::UpgradeIntrinsicFunction(Function* F) { +// Utility function for getting the correct suffix given a type +static inline const char* get_suffix(const Type* Ty) { + if (Ty == Type::UIntTy) + return ".i32"; + if (Ty == Type::UShortTy) + return ".i16"; + if (Ty == Type::UByteTy) + return ".i8"; + if (Ty == Type::ULongTy) + return ".i64"; + if (Ty == Type::FloatTy) + return ".f32"; + if (Ty == Type::DoubleTy) + return ".f64"; + return 0; +} + +static inline const Type* get_type(Function* F) { + // If there's no function, we can't get the argument type. + if (!F) + return 0; // Get the Function's name. const std::string& Name = F->getName(); @@ -29,77 +50,147 @@ // Quickly eliminate it, if it's not a candidate. if (Name.length() <= 5 || Name[0] != 'l' || Name[1] != 'l' || Name[2] != 'v' || Name[3] != 'm' || Name[4] != '.') + return 0; + + switch (Name[5]) { + case 'b': + if (Name == "llvm.bswap") + return F->getReturnType(); + break; + case 'c': + if (Name == "llvm.ctpop" || Name == "llvm.ctlz" || Name == "llvm.cttz") + return F->getReturnType(); + break; + case 'i': + if (Name == "llvm.isunordered") { + Function::const_arg_iterator ArgIt = F->arg_begin(); + if (ArgIt != F->arg_end()) + return ArgIt->getType(); + } + break; + case 's': + if (Name == "llvm.sqrt") + return F->getReturnType(); + break; + default: + break; + } + return 0; +} + +bool llvm::IsUpgradeableIntrinsicName(const std::string& Name) { + // Quickly eliminate it, if it's not a candidate. + if (Name.length() <= 5 || Name[0] != 'l' || Name[1] != 'l' || Name[2] != + 'v' || Name[3] != 'm' || Name[4] != '.') return false; - // See if its one of the name's we're interested in. switch (Name[5]) { case 'b': - if (Name == "llvm.bswap") { - const Type* Ty = F->getReturnType(); - std::string new_name = Name; - if (Ty == Type::UShortTy || Ty == Type::ShortTy) - new_name += ".i16"; - else if (Ty == Type::UIntTy || Ty == Type::IntTy) - new_name += ".i32"; - else if (Ty == Type::ULongTy || Ty == Type::LongTy) - new_name += ".i64"; - std::cerr << "WARNING: change " << Name << " to " - << new_name << "\n"; - F->setName(new_name); + if (Name == "llvm.bswap") return true; - } break; case 'c': - if (Name == "llvm.ctpop" || Name == "llvm.ctlz" || - Name == "llvm.cttz") { - const Type* Ty = F->getReturnType(); - std::string new_name = Name; - if (Ty == Type::UByteTy || Ty == Type::SByteTy) - new_name += ".i8"; - else if (Ty == Type::UShortTy || Ty == Type::ShortTy) - new_name += ".i16"; - else if (Ty == Type::UIntTy || Ty == Type::IntTy) - new_name += ".i32"; - else if (Ty == Type::ULongTy || Ty == Type::LongTy) - new_name += ".i64"; - std::cerr << "WARNING: change " << Name << " to " - << new_name << "\n"; - F->setName(new_name); + if (Name == "llvm.ctpop" || Name == "llvm.ctlz" || Name == "llvm.cttz") return true; - } break; case 'i': - if (Name == "llvm.isunordered") { - Function::const_arg_iterator ArgIt = F->arg_begin(); - const Type* Ty = ArgIt->getType(); - std::string new_name = Name; - if (Ty == Type::FloatTy) - new_name += ".f32"; - else if (Ty == Type::DoubleTy) - new_name += ".f64"; - std::cerr << "WARNING: change " << Name << " to " - << new_name << "\n"; - F->setName(new_name); + if (Name == "llvm.isunordered") return true; - } break; case 's': - if (Name == "llvm.sqrt") { - const Type* Ty = F->getReturnType(); - std::string new_name = Name; - if (Ty == Type::FloatTy) - new_name += ".f32"; - else if (Ty == Type::DoubleTy) { - new_name += ".f64"; - } - std::cerr << "WARNING: change " << Name << " to " - << new_name << "\n"; - F->setName(new_name); + if (Name == "llvm.sqrt") return true; - } break; default: break; } return false; } + +// UpgradeIntrinsicFunction - Convert overloaded intrinsic function names to +// their non-overloaded variants by appending the appropriate suffix based on +// the argument types. +Function* llvm::UpgradeIntrinsicFunction(Function* F) { + // See if its one of the name's we're interested in. + if (const Type* Ty = get_type(F)) { + const char* suffix = get_suffix(Ty); + if (Ty->isSigned()) + suffix = get_suffix(Ty->getUnsignedVersion()); + assert(suffix && "Intrinsic parameter type not recognized"); + const std::string& Name = F->getName(); + std::string new_name = Name + suffix; + std::cerr << "WARNING: change " << Name << " to " << new_name << "\n"; + SymbolTable& SymTab = F->getParent()->getSymbolTable(); + if (Value* V = SymTab.lookup(F->getType(),new_name)) + if (Function* OtherF = dyn_cast(V)) + return OtherF; + + // There wasn't an existing function for the intrinsic, so now make sure the + // signedness of the arguments is correct. + if (Ty->isSigned()) { + const Type* newTy = Ty->getUnsignedVersion(); + std::vector Params; + Params.push_back(newTy); + FunctionType* FT = FunctionType::get(newTy, Params,false); + return new Function(FT, GlobalValue::ExternalLinkage, new_name, + F->getParent()); + } + + // The argument was the correct type (unsigned or floating), so just + // rename the function to its correct name and return it. + F->setName(new_name); + return F; + } + return 0; +} + +CallInst* llvm::UpgradeIntrinsicCall(CallInst *CI) { + Function *F = CI->getCalledFunction(); + if (const Type* Ty = get_type(F)) { + Function* newF = UpgradeIntrinsicFunction(F); + std::vector Oprnds; + for (User::op_iterator OI = CI->op_begin(), OE = CI->op_end(); + OI != OE; ++OI) + Oprnds.push_back(CI); + CallInst* newCI = new CallInst(newF,Oprnds,"autoupgrade_call",CI); + if (Ty->isSigned()) { + const Type* newTy = Ty->getUnsignedVersion(); + newCI->setOperand(1,new CastInst(newCI->getOperand(1), newTy, + "autoupgrade_cast", newCI)); + } + return newCI; + } + return 0; +} + +bool llvm::UpgradeCallsToIntrinsic(Function* F) { + if (Function* newF = UpgradeIntrinsicFunction(F)) { + for (Value::use_iterator UI = F->use_begin(), UE = F->use_end(); + UI != UE; ++UI) { + if (CallInst* CI = dyn_cast(*UI)) { + std::vector Oprnds; + User::op_iterator OI = CI->op_begin(); + ++OI; + for (User::op_iterator OE = CI->op_end(); OI != OE; ++OI) + Oprnds.push_back(*OI); + CallInst* newCI = new CallInst(newF,Oprnds,"autoupgrade_call",CI); + const Type* Ty = Oprnds[0]->getType(); + if (Ty->isSigned()) { + const Type* newTy = Ty->getUnsignedVersion(); + newCI->setOperand(1,new CastInst(newCI->getOperand(1), newTy, + "autoupgrade_cast", newCI)); + CastInst* final = new CastInst(newCI, Ty, "autoupgrade_uncast",newCI); + newCI->moveBefore(final); + CI->replaceAllUsesWith(final); + } else { + CI->replaceAllUsesWith(newCI); + } + CI->eraseFromParent(); + } + } + if (newF != F) + F->eraseFromParent(); + return true; + } + return false; +} From reid at x10sys.com Wed Jan 18 19:20:15 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 19:20:15 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/Verifier.cpp Message-ID: <200601190120.TAA26368@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: Verifier.cpp updated: 1.144 -> 1.145 --- Log message: Don't accept the ctpop, cttz, or ctlz intrinsics with signed arguments. The interface requires unsigned arguments. --- Diffs of the changes: (+16 -36) Verifier.cpp | 52 ++++++++++++++++------------------------------------ 1 files changed, 16 insertions(+), 36 deletions(-) Index: llvm/lib/VMCore/Verifier.cpp diff -u llvm/lib/VMCore/Verifier.cpp:1.144 llvm/lib/VMCore/Verifier.cpp:1.145 --- llvm/lib/VMCore/Verifier.cpp:1.144 Tue Jan 17 14:07:22 2006 +++ llvm/lib/VMCore/Verifier.cpp Wed Jan 18 19:20:03 2006 @@ -810,9 +810,8 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UByteTy - || FT->getParamType(0) == Type::SByteTy, - "Argument must be a byte type!", IF); + Assert1(FT->getParamType(0) == Type::UByteTy, + "Argument is not ubyte!", IF); NumArgs = 1; break; @@ -821,9 +820,8 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UShortTy - || FT->getParamType(0) == Type::ShortTy, - "Argument must be a short type!", IF); + Assert1(FT->getParamType(0) == Type::UShortTy, + "Argument is not ushort!", IF); NumArgs = 1; break; @@ -832,9 +830,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UIntTy - || FT->getParamType(0) == Type::IntTy, - "Argument must be an int type!", IF); + Assert1(FT->getParamType(0) == Type::UIntTy, "Argument is not uint!", IF); NumArgs = 1; break; @@ -843,9 +839,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::ULongTy - || FT->getParamType(0) == Type::LongTy, - "Argument must be a long type!", IF); + Assert1(FT->getParamType(0) == Type::ULongTy, "Argument is not ulong!", IF); NumArgs = 1; break; @@ -854,9 +848,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UByteTy - || FT->getParamType(0) == Type::SByteTy, - "Argument must be a byte type!", IF); + Assert1(FT->getParamType(0) == Type::UByteTy, "Argument is not ubyte!", IF); NumArgs = 1; break; @@ -865,9 +857,8 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UShortTy - || FT->getParamType(0) == Type::ShortTy, - "Argument must be a short type!", IF); + Assert1(FT->getParamType(0) == Type::UShortTy, + "Argument is not ushort!", IF); NumArgs = 1; break; case Intrinsic::ctlz_i32: @@ -875,9 +866,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UIntTy - || FT->getParamType(0) == Type::IntTy, - "Argument must be an int type!", IF); + Assert1(FT->getParamType(0) == Type::UIntTy, "Argument is not uint!", IF); NumArgs = 1; break; case Intrinsic::ctlz_i64: @@ -885,9 +874,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::ULongTy - || FT->getParamType(0) == Type::LongTy, - "Argument must be a long type!", IF); + Assert1(FT->getParamType(0) == Type::ULongTy, "Argument is not ulong!", IF); NumArgs = 1; break; case Intrinsic::cttz_i8: @@ -895,9 +882,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UByteTy - || FT->getParamType(0) == Type::SByteTy, - "Argument must be a byte type!", IF); + Assert1(FT->getParamType(0) == Type::UByteTy, "Argument is not ubyte!", IF); NumArgs = 1; break; case Intrinsic::cttz_i16: @@ -905,9 +890,8 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UShortTy - || FT->getParamType(0) == Type::ShortTy, - "Argument must be a short type!", IF); + Assert1(FT->getParamType(0) == Type::UShortTy, + "Argument is not ushort!", IF); NumArgs = 1; break; case Intrinsic::cttz_i32: @@ -915,9 +899,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::UIntTy - || FT->getParamType(0) == Type::IntTy, - "Argument must be an int type!", IF); + Assert1(FT->getParamType(0) == Type::UIntTy, "Argument is not uint!", IF); NumArgs = 1; break; case Intrinsic::cttz_i64: @@ -925,9 +907,7 @@ "Illegal # arguments for intrinsic function!", IF); Assert1(FT->getReturnType() == FT->getParamType(0), "Return type does not match source type", IF); - Assert1(FT->getParamType(0) == Type::ULongTy - || FT->getParamType(0) == Type::LongTy, - "Argument must be a long type!", IF); + Assert1(FT->getParamType(0) == Type::ULongTy, "Argument Is not ulong!", IF); NumArgs = 1; break; From reid at x10sys.com Wed Jan 18 19:21:16 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 19:21:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Message-ID: <200601190121.TAA26385@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.178 -> 1.179 --- Log message: Make sure intrinsic auto-upgrade is invoked correctly. --- Diffs of the changes: (+5 -0) Reader.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.178 llvm/lib/Bytecode/Reader/Reader.cpp:1.179 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.178 Tue Jan 17 14:06:35 2006 +++ llvm/lib/Bytecode/Reader/Reader.cpp Wed Jan 18 19:21:04 2006 @@ -857,6 +857,11 @@ } Result = new CallInst(F, Params); + if (CallInst* newCI = UpgradeIntrinsicCall(cast(Result))) { + Result->replaceAllUsesWith(newCI); + Result->eraseFromParent(); + Result = newCI; + } if (isTailCall) cast(Result)->setTailCall(); if (CallingConv) cast(Result)->setCallingConv(CallingConv); break; From reid at x10sys.com Wed Jan 18 19:21:16 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 19:21:16 -0600 Subject: [llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.cpp llvmAsmParser.h llvmAsmParser.y Message-ID: <200601190121.TAA26393@zion.cs.uiuc.edu> Changes in directory llvm/lib/AsmParser: llvmAsmParser.cpp updated: 1.31 -> 1.32 llvmAsmParser.h updated: 1.15 -> 1.16 llvmAsmParser.y updated: 1.244 -> 1.245 --- Log message: Make sure intrinsic auto-upgrade is invoked correctly. --- Diffs of the changes: (+2971 -2188) llvmAsmParser.cpp | 4791 ++++++++++++++++++++++++++++++------------------------ llvmAsmParser.h | 336 ++- llvmAsmParser.y | 8 3 files changed, 2971 insertions(+), 2164 deletions(-) Index: llvm/lib/AsmParser/llvmAsmParser.cpp diff -u llvm/lib/AsmParser/llvmAsmParser.cpp:1.31 llvm/lib/AsmParser/llvmAsmParser.cpp:1.32 --- llvm/lib/AsmParser/llvmAsmParser.cpp:1.31 Tue Jan 17 14:06:25 2006 +++ llvm/lib/AsmParser/llvmAsmParser.cpp Wed Jan 18 19:21:04 2006 @@ -1,113 +1,265 @@ +/* A Bison parser, made by GNU Bison 1.875c. */ -/* A Bison parser, made from /Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y - by GNU Bison version 1.28 */ +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -#define YYBISON 1 /* Identify Bison output. */ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Using locations. */ +#define YYLSP_NEEDED 0 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ #define yyparse llvmAsmparse -#define yylex llvmAsmlex +#define yylex llvmAsmlex #define yyerror llvmAsmerror -#define yylval llvmAsmlval -#define yychar llvmAsmchar +#define yylval llvmAsmlval +#define yychar llvmAsmchar #define yydebug llvmAsmdebug #define yynerrs llvmAsmnerrs -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define SINTVAL 259 -#define UINTVAL 260 -#define FPVAL 261 -#define VOID 262 -#define BOOL 263 -#define SBYTE 264 -#define UBYTE 265 -#define SHORT 266 -#define USHORT 267 -#define INT 268 -#define UINT 269 -#define LONG 270 -#define ULONG 271 -#define FLOAT 272 -#define DOUBLE 273 -#define TYPE 274 -#define LABEL 275 -#define VAR_ID 276 -#define LABELSTR 277 -#define STRINGCONSTANT 278 -#define IMPLEMENTATION 279 -#define ZEROINITIALIZER 280 -#define TRUETOK 281 -#define FALSETOK 282 -#define BEGINTOK 283 -#define ENDTOK 284 -#define DECLARE 285 -#define GLOBAL 286 -#define CONSTANT 287 -#define SECTION 288 -#define VOLATILE 289 -#define TO 290 -#define DOTDOTDOT 291 -#define NULL_TOK 292 -#define UNDEF 293 -#define CONST 294 -#define INTERNAL 295 -#define LINKONCE 296 -#define WEAK 297 -#define APPENDING 298 -#define OPAQUE 299 -#define NOT 300 -#define EXTERNAL 301 -#define TARGET 302 -#define TRIPLE 303 -#define ENDIAN 304 -#define POINTERSIZE 305 -#define LITTLE 306 -#define BIG 307 -#define ALIGN 308 -#define DEPLIBS 309 -#define CALL 310 -#define TAIL 311 -#define CC_TOK 312 -#define CCC_TOK 313 -#define FASTCC_TOK 314 -#define COLDCC_TOK 315 -#define RET 316 -#define BR 317 -#define SWITCH 318 -#define INVOKE 319 -#define UNWIND 320 -#define UNREACHABLE 321 -#define ADD 322 -#define SUB 323 -#define MUL 324 -#define DIV 325 -#define REM 326 -#define AND 327 -#define OR 328 -#define XOR 329 -#define SETLE 330 -#define SETGE 331 -#define SETLT 332 -#define SETGT 333 -#define SETEQ 334 -#define SETNE 335 -#define MALLOC 336 -#define ALLOCA 337 -#define FREE 338 -#define LOAD 339 -#define STORE 340 -#define GETELEMENTPTR 341 -#define PHI_TOK 342 -#define CAST 343 -#define SELECT 344 -#define SHL 345 -#define SHR 346 -#define VAARG 347 -#define EXTRACTELEMENT 348 -#define INSERTELEMENT 349 -#define VAARG_old 350 -#define VANEXT_old 351 -#line 14 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + SECTION = 289, + VOLATILE = 290, + TO = 291, + DOTDOTDOT = 292, + NULL_TOK = 293, + UNDEF = 294, + CONST = 295, + INTERNAL = 296, + LINKONCE = 297, + WEAK = 298, + APPENDING = 299, + OPAQUE = 300, + NOT = 301, + EXTERNAL = 302, + TARGET = 303, + TRIPLE = 304, + ENDIAN = 305, + POINTERSIZE = 306, + LITTLE = 307, + BIG = 308, + ALIGN = 309, + DEPLIBS = 310, + CALL = 311, + TAIL = 312, + CC_TOK = 313, + CCC_TOK = 314, + FASTCC_TOK = 315, + COLDCC_TOK = 316, + RET = 317, + BR = 318, + SWITCH = 319, + INVOKE = 320, + UNWIND = 321, + UNREACHABLE = 322, + ADD = 323, + SUB = 324, + MUL = 325, + DIV = 326, + REM = 327, + AND = 328, + OR = 329, + XOR = 330, + SETLE = 331, + SETGE = 332, + SETLT = 333, + SETGT = 334, + SETEQ = 335, + SETNE = 336, + MALLOC = 337, + ALLOCA = 338, + FREE = 339, + LOAD = 340, + STORE = 341, + GETELEMENTPTR = 342, + PHI_TOK = 343, + CAST = 344, + SELECT = 345, + SHL = 346, + SHR = 347, + VAARG = 348, + EXTRACTELEMENT = 349, + INSERTELEMENT = 350, + VAARG_old = 351, + VANEXT_old = 352 + }; +#endif +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define SECTION 289 +#define VOLATILE 290 +#define TO 291 +#define DOTDOTDOT 292 +#define NULL_TOK 293 +#define UNDEF 294 +#define CONST 295 +#define INTERNAL 296 +#define LINKONCE 297 +#define WEAK 298 +#define APPENDING 299 +#define OPAQUE 300 +#define NOT 301 +#define EXTERNAL 302 +#define TARGET 303 +#define TRIPLE 304 +#define ENDIAN 305 +#define POINTERSIZE 306 +#define LITTLE 307 +#define BIG 308 +#define ALIGN 309 +#define DEPLIBS 310 +#define CALL 311 +#define TAIL 312 +#define CC_TOK 313 +#define CCC_TOK 314 +#define FASTCC_TOK 315 +#define COLDCC_TOK 316 +#define RET 317 +#define BR 318 +#define SWITCH 319 +#define INVOKE 320 +#define UNWIND 321 +#define UNREACHABLE 322 +#define ADD 323 +#define SUB 324 +#define MUL 325 +#define DIV 326 +#define REM 327 +#define AND 328 +#define OR 329 +#define XOR 330 +#define SETLE 331 +#define SETGE 332 +#define SETLT 333 +#define SETGT 334 +#define SETEQ 335 +#define SETNE 336 +#define MALLOC 337 +#define ALLOCA 338 +#define FREE 339 +#define LOAD 340 +#define STORE 341 +#define GETELEMENTPTR 342 +#define PHI_TOK 343 +#define CAST 344 +#define SELECT 345 +#define SHL 346 +#define SHR 347 +#define VAARG 348 +#define EXTRACTELEMENT 349 +#define INSERTELEMENT 350 +#define VAARG_old 351 +#define VANEXT_old 352 + + + + +/* Copy the first part of user declarations. */ +#line 14 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" #include "ParserInternals.h" #include "llvm/CallingConv.h" @@ -202,10 +354,10 @@ ThrowException(UndefinedReferences); } - // Rename any overloaded intrinsic functions. - for (Module::iterator FI = CurrentModule->begin(), FE = - CurrentModule->end(); FI != FE; ++FI) - UpgradeIntrinsicFunction(&(*FI)); + // Look for intrinsic functions and CallInst that need to be upgraded + for (Module::iterator FI = CurrentModule->begin(),FE = CurrentModule->end(); + FI != FE; ++FI) + UpgradeCallsToIntrinsic(FI); Values.clear(); // Clear out function local definitions Types.clear(); @@ -971,8 +1123,23 @@ } -#line 878 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -typedef union { + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 878 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -1011,939 +1178,1284 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -#include - -#ifndef __cplusplus -#ifndef __STDC__ -#define const -#endif +/* Line 191 of yacc.c. */ +#line 1183 "llvmAsmParser.tab.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 #endif -#define YYFINAL 460 -#define YYFLAG -32768 -#define YYNTBASE 112 - -#define YYTRANSLATE(x) ((unsigned)(x) <= 351 ? yytranslate[x] : 181) - -static const char yytranslate[] = { 0, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 101, - 102, 110, 2, 99, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 106, - 98, 107, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 103, 100, 105, 2, 2, 2, 2, 2, 111, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 104, - 2, 2, 108, 2, 109, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, - 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, - 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, - 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, - 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, - 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, - 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, - 97 -}; +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 1195 "llvmAsmParser.tab.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) -#if YYDEBUG != 0 -static const short yyprhs[] = { 0, - 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, - 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, - 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, - 60, 62, 64, 67, 68, 70, 72, 74, 76, 77, - 78, 80, 82, 84, 87, 88, 91, 92, 96, 99, - 100, 102, 103, 107, 109, 112, 114, 116, 118, 120, - 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, - 142, 144, 146, 148, 150, 152, 154, 157, 162, 168, - 174, 178, 181, 184, 186, 190, 192, 196, 198, 199, - 204, 208, 212, 217, 222, 226, 229, 232, 235, 238, - 241, 244, 247, 250, 253, 256, 263, 269, 278, 285, - 292, 299, 306, 313, 317, 319, 321, 323, 325, 328, - 331, 334, 336, 341, 344, 345, 353, 354, 362, 366, - 371, 372, 374, 376, 380, 384, 388, 392, 396, 398, - 399, 401, 403, 405, 406, 409, 413, 415, 417, 421, - 423, 424, 433, 435, 437, 441, 443, 445, 448, 449, - 453, 455, 457, 459, 461, 463, 465, 467, 469, 473, - 475, 477, 479, 481, 483, 486, 489, 492, 496, 499, - 500, 502, 505, 508, 512, 522, 532, 541, 555, 557, - 559, 566, 572, 575, 582, 590, 592, 596, 598, 599, - 602, 604, 610, 616, 622, 625, 630, 635, 642, 647, - 652, 657, 662, 669, 672, 680, 682, 685, 686, 688, - 689, 693, 700, 704, 711, 714, 719, 726 -}; +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short yyss; + YYSTYPE yyvs; + }; -static const short yyrhs[] = { 5, - 0, 6, 0, 3, 0, 4, 0, 68, 0, 69, - 0, 70, 0, 71, 0, 72, 0, 73, 0, 74, - 0, 75, 0, 76, 0, 77, 0, 78, 0, 79, - 0, 80, 0, 81, 0, 91, 0, 92, 0, 16, - 0, 14, 0, 12, 0, 10, 0, 17, 0, 15, - 0, 13, 0, 11, 0, 118, 0, 119, 0, 18, - 0, 19, 0, 151, 98, 0, 0, 41, 0, 42, - 0, 43, 0, 44, 0, 0, 0, 59, 0, 60, - 0, 61, 0, 58, 4, 0, 0, 54, 4, 0, - 0, 99, 54, 4, 0, 34, 24, 0, 0, 127, - 0, 0, 99, 130, 129, 0, 127, 0, 54, 4, - 0, 133, 0, 8, 0, 135, 0, 8, 0, 135, - 0, 9, 0, 10, 0, 11, 0, 12, 0, 13, - 0, 14, 0, 15, 0, 16, 0, 17, 0, 18, - 0, 19, 0, 20, 0, 21, 0, 45, 0, 134, - 0, 164, 0, 100, 4, 0, 132, 101, 137, 102, - 0, 103, 4, 104, 135, 105, 0, 106, 4, 104, - 135, 107, 0, 108, 136, 109, 0, 108, 109, 0, - 135, 110, 0, 135, 0, 136, 99, 135, 0, 136, - 0, 136, 99, 37, 0, 37, 0, 0, 133, 103, - 140, 105, 0, 133, 103, 105, 0, 133, 111, 24, - 0, 133, 106, 140, 107, 0, 133, 108, 140, 109, - 0, 133, 108, 109, 0, 133, 38, 0, 133, 39, - 0, 133, 164, 0, 133, 139, 0, 133, 26, 0, - 118, 113, 0, 119, 4, 0, 9, 27, 0, 9, - 28, 0, 121, 7, 0, 89, 101, 138, 36, 133, - 102, 0, 87, 101, 138, 178, 102, 0, 90, 101, - 138, 99, 138, 99, 138, 102, 0, 114, 101, 138, - 99, 138, 102, 0, 115, 101, 138, 99, 138, 102, - 0, 116, 101, 138, 99, 138, 102, 0, 117, 101, - 138, 99, 138, 102, 0, 94, 101, 138, 99, 138, - 102, 0, 140, 99, 138, 0, 138, 0, 32, 0, - 33, 0, 143, 0, 143, 160, 0, 143, 161, 0, - 143, 25, 0, 144, 0, 144, 122, 20, 131, 0, - 144, 161, 0, 0, 144, 122, 123, 141, 138, 145, - 129, 0, 0, 144, 122, 47, 141, 133, 146, 129, - 0, 144, 48, 148, 0, 144, 55, 98, 149, 0, - 0, 53, 0, 52, 0, 50, 98, 147, 0, 51, - 98, 4, 0, 49, 98, 24, 0, 103, 150, 105, - 0, 150, 99, 24, 0, 24, 0, 0, 22, 0, - 24, 0, 151, 0, 0, 133, 152, 0, 154, 99, - 153, 0, 153, 0, 154, 0, 154, 99, 37, 0, - 37, 0, 0, 124, 131, 151, 101, 155, 102, 128, - 125, 0, 29, 0, 108, 0, 123, 156, 157, 0, - 30, 0, 109, 0, 167, 159, 0, 0, 31, 162, - 156, 0, 3, 0, 4, 0, 7, 0, 27, 0, - 28, 0, 38, 0, 39, 0, 26, 0, 106, 140, - 107, 0, 139, 0, 112, 0, 151, 0, 164, 0, - 163, 0, 133, 165, 0, 167, 168, 0, 158, 168, - 0, 169, 122, 170, 0, 169, 172, 0, 0, 23, - 0, 62, 166, 0, 62, 8, 0, 63, 21, 165, - 0, 63, 9, 165, 99, 21, 165, 99, 21, 165, - 0, 64, 120, 165, 99, 21, 165, 103, 171, 105, - 0, 64, 120, 165, 99, 21, 165, 103, 105, 0, - 65, 124, 131, 165, 101, 175, 102, 36, 21, 165, - 66, 21, 165, 0, 66, 0, 67, 0, 171, 120, - 163, 99, 21, 165, 0, 120, 163, 99, 21, 165, - 0, 122, 177, 0, 133, 103, 165, 99, 165, 105, - 0, 173, 99, 103, 165, 99, 165, 105, 0, 166, - 0, 174, 99, 166, 0, 174, 0, 0, 57, 56, - 0, 56, 0, 114, 133, 165, 99, 165, 0, 115, - 133, 165, 99, 165, 0, 116, 133, 165, 99, 165, - 0, 46, 166, 0, 117, 166, 99, 166, 0, 89, - 166, 36, 133, 0, 90, 166, 99, 166, 99, 166, - 0, 93, 166, 99, 133, 0, 96, 166, 99, 133, - 0, 97, 166, 99, 133, 0, 94, 166, 99, 166, - 0, 95, 166, 99, 166, 99, 166, 0, 88, 173, - 0, 176, 124, 131, 165, 101, 175, 102, 0, 180, - 0, 99, 174, 0, 0, 35, 0, 0, 82, 133, - 126, 0, 82, 133, 99, 15, 165, 126, 0, 83, - 133, 126, 0, 83, 133, 99, 15, 165, 126, 0, - 84, 166, 0, 179, 85, 133, 165, 0, 179, 86, - 166, 99, 133, 165, 0, 87, 133, 165, 178, 0 -}; +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) -#endif +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) -#if YYDEBUG != 0 -static const short yyrline[] = { 0, - 997, 998, 1005, 1006, 1015, 1015, 1015, 1015, 1015, 1016, - 1016, 1016, 1017, 1017, 1017, 1017, 1017, 1017, 1019, 1019, - 1023, 1023, 1023, 1023, 1024, 1024, 1024, 1024, 1025, 1025, - 1026, 1026, 1029, 1032, 1036, 1036, 1037, 1038, 1039, 1042, - 1042, 1043, 1044, 1045, 1054, 1054, 1060, 1060, 1068, 1075, - 1075, 1081, 1081, 1083, 1087, 1100, 1100, 1101, 1101, 1103, - 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1113, 1113, 1113, - 1113, 1113, 1113, 1114, 1117, 1120, 1126, 1133, 1145, 1149, - 1160, 1169, 1172, 1180, 1184, 1189, 1190, 1193, 1196, 1206, - 1231, 1244, 1272, 1297, 1317, 1329, 1338, 1342, 1401, 1407, - 1415, 1420, 1425, 1428, 1431, 1438, 1448, 1479, 1486, 1507, - 1517, 1522, 1529, 1539, 1542, 1549, 1549, 1559, 1566, 1570, - 1573, 1576, 1589, 1609, 1611, 1614, 1617, 1621, 1624, 1626, - 1628, 1633, 1634, 1636, 1639, 1647, 1652, 1654, 1658, 1662, - 1670, 1670, 1671, 1671, 1673, 1679, 1684, 1690, 1693, 1698, - 1702, 1706, 1792, 1792, 1794, 1802, 1802, 1804, 1808, 1808, - 1817, 1820, 1823, 1826, 1829, 1832, 1835, 1838, 1841, 1865, - 1872, 1875, 1880, 1880, 1886, 1890, 1893, 1901, 1910, 1914, - 1924, 1935, 1938, 1941, 1944, 1947, 1961, 1965, 2018, 2021, - 2027, 2035, 2045, 2052, 2057, 2064, 2068, 2074, 2074, 2076, - 2079, 2085, 2097, 2108, 2118, 2130, 2137, 2144, 2151, 2156, - 2175, 2197, 2205, 2217, 2231, 2288, 2294, 2296, 2300, 2303, - 2309, 2313, 2317, 2321, 2325, 2332, 2342, 2355 -}; #endif - -#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) - -static const char * const yytname[] = { "$","error","$undefined.","ESINT64VAL", -"EUINT64VAL","SINTVAL","UINTVAL","FPVAL","VOID","BOOL","SBYTE","UBYTE","SHORT", -"USHORT","INT","UINT","LONG","ULONG","FLOAT","DOUBLE","TYPE","LABEL","VAR_ID", -"LABELSTR","STRINGCONSTANT","IMPLEMENTATION","ZEROINITIALIZER","TRUETOK","FALSETOK", -"BEGINTOK","ENDTOK","DECLARE","GLOBAL","CONSTANT","SECTION","VOLATILE","TO", -"DOTDOTDOT","NULL_TOK","UNDEF","CONST","INTERNAL","LINKONCE","WEAK","APPENDING", -"OPAQUE","NOT","EXTERNAL","TARGET","TRIPLE","ENDIAN","POINTERSIZE","LITTLE", -"BIG","ALIGN","DEPLIBS","CALL","TAIL","CC_TOK","CCC_TOK","FASTCC_TOK","COLDCC_TOK", -"RET","BR","SWITCH","INVOKE","UNWIND","UNREACHABLE","ADD","SUB","MUL","DIV", -"REM","AND","OR","XOR","SETLE","SETGE","SETLT","SETGT","SETEQ","SETNE","MALLOC", -"ALLOCA","FREE","LOAD","STORE","GETELEMENTPTR","PHI_TOK","CAST","SELECT","SHL", -"SHR","VAARG","EXTRACTELEMENT","INSERTELEMENT","VAARG_old","VANEXT_old","'='", -"','","'\\\\'","'('","')'","'['","'x'","']'","'<'","'>'","'{'","'}'","'*'","'c'", -"INTVAL","EINT64VAL","ArithmeticOps","LogicalOps","SetCondOps","ShiftOps","SIntType", -"UIntType","IntType","FPType","OptAssign","OptLinkage","OptCallingConv","OptAlign", -"OptCAlign","SectionString","OptSection","GlobalVarAttributes","GlobalVarAttribute", -"TypesV","UpRTypesV","Types","PrimType","UpRTypes","TypeListI","ArgTypeListI", -"ConstVal","ConstExpr","ConstVector","GlobalType","Module","FunctionList","ConstPool", -"@1","@2","BigOrLittle","TargetDefinition","LibrariesDefinition","LibList","Name", -"OptName","ArgVal","ArgListH","ArgList","FunctionHeaderH","BEGIN","FunctionHeader", -"END","Function","FunctionProto","@3","ConstValueRef","SymbolicValueRef","ValueRef", -"ResolvedVal","BasicBlockList","BasicBlock","InstructionList","BBTerminatorInst", -"JumpTable","Inst","PHIList","ValueRefList","ValueRefListE","OptTailCall","InstVal", -"IndexList","OptVolatile","MemoryInst", NULL -}; +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short yysigned_char; #endif -static const short yyr1[] = { 0, - 112, 112, 113, 113, 114, 114, 114, 114, 114, 115, - 115, 115, 116, 116, 116, 116, 116, 116, 117, 117, - 118, 118, 118, 118, 119, 119, 119, 119, 120, 120, - 121, 121, 122, 122, 123, 123, 123, 123, 123, 124, - 124, 124, 124, 124, 125, 125, 126, 126, 127, 128, - 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, - 134, 134, 134, 134, 134, 134, 134, 134, 134, 134, - 134, 134, 134, 135, 135, 135, 135, 135, 135, 135, - 135, 135, 135, 136, 136, 137, 137, 137, 137, 138, - 138, 138, 138, 138, 138, 138, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 139, 139, 139, 139, 139, - 139, 139, 139, 140, 140, 141, 141, 142, 143, 143, - 143, 143, 144, 144, 145, 144, 146, 144, 144, 144, - 144, 147, 147, 148, 148, 148, 149, 150, 150, 150, - 151, 151, 152, 152, 153, 154, 154, 155, 155, 155, - 155, 156, 157, 157, 158, 159, 159, 160, 162, 161, - 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, - 164, 164, 165, 165, 166, 167, 167, 168, 169, 169, - 169, 170, 170, 170, 170, 170, 170, 170, 170, 170, - 171, 171, 172, 173, 173, 174, 174, 175, 175, 176, - 176, 177, 177, 177, 177, 177, 177, 177, 177, 177, - 177, 177, 177, 177, 177, 177, 178, 178, 179, 179, - 180, 180, 180, 180, 180, 180, 180, 180 +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 4 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 1210 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 112 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 70 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 229 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 460 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 352 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 101, 102, 110, 2, 99, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 106, 98, 107, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 103, 100, 105, 2, 2, 2, 2, 2, 111, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 104, 2, 2, 108, 2, 109, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97 }; -static const short yyr2[] = { 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 2, 0, 1, 1, 1, 1, 0, 0, - 1, 1, 1, 2, 0, 2, 0, 3, 2, 0, - 1, 0, 3, 1, 2, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 2, 4, 5, 5, - 3, 2, 2, 1, 3, 1, 3, 1, 0, 4, - 3, 3, 4, 4, 3, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 6, 5, 8, 6, 6, - 6, 6, 6, 3, 1, 1, 1, 1, 2, 2, - 2, 1, 4, 2, 0, 7, 0, 7, 3, 4, - 0, 1, 1, 3, 3, 3, 3, 3, 1, 0, - 1, 1, 1, 0, 2, 3, 1, 1, 3, 1, - 0, 8, 1, 1, 3, 1, 1, 2, 0, 3, - 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, - 1, 1, 1, 1, 2, 2, 2, 3, 2, 0, - 1, 2, 2, 3, 9, 9, 8, 13, 1, 1, - 6, 5, 2, 6, 7, 1, 3, 1, 0, 2, - 1, 5, 5, 5, 2, 4, 4, 6, 4, 4, - 4, 4, 6, 2, 7, 1, 2, 0, 1, 0, - 3, 6, 3, 6, 2, 4, 6, 4 +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned short yyprhs[] = +{ + 0, 0, 3, 5, 7, 9, 11, 13, 15, 17, + 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, + 39, 41, 43, 45, 47, 49, 51, 53, 55, 57, + 59, 61, 63, 65, 67, 70, 71, 73, 75, 77, + 79, 80, 81, 83, 85, 87, 90, 91, 94, 95, + 99, 102, 103, 105, 106, 110, 112, 115, 117, 119, + 121, 123, 125, 127, 129, 131, 133, 135, 137, 139, + 141, 143, 145, 147, 149, 151, 153, 155, 157, 160, + 165, 171, 177, 181, 184, 187, 189, 193, 195, 199, + 201, 202, 207, 211, 215, 220, 225, 229, 232, 235, + 238, 241, 244, 247, 250, 253, 256, 259, 266, 272, + 281, 288, 295, 302, 309, 316, 320, 322, 324, 326, + 328, 331, 334, 337, 339, 344, 347, 348, 356, 357, + 365, 369, 374, 375, 377, 379, 383, 387, 391, 395, + 399, 401, 402, 404, 406, 408, 409, 412, 416, 418, + 420, 424, 426, 427, 436, 438, 440, 444, 446, 448, + 451, 452, 456, 458, 460, 462, 464, 466, 468, 470, + 472, 476, 478, 480, 482, 484, 486, 489, 492, 495, + 499, 502, 503, 505, 508, 511, 515, 525, 535, 544, + 558, 560, 562, 569, 575, 578, 585, 593, 595, 599, + 601, 602, 605, 607, 613, 619, 625, 628, 633, 638, + 645, 650, 655, 660, 665, 672, 675, 683, 685, 688, + 689, 691, 692, 696, 703, 707, 714, 717, 722, 729 }; -static const short yydefact[] = { 131, - 39, 122, 121, 159, 35, 36, 37, 38, 40, 180, - 119, 120, 180, 141, 142, 0, 0, 39, 0, 124, - 40, 0, 41, 42, 43, 0, 0, 181, 177, 34, - 156, 157, 158, 176, 0, 0, 0, 129, 0, 0, - 0, 0, 33, 160, 44, 1, 2, 57, 61, 62, - 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, - 73, 74, 0, 0, 0, 0, 171, 0, 0, 56, - 75, 60, 172, 76, 153, 154, 155, 220, 179, 0, - 0, 0, 140, 130, 123, 116, 117, 0, 0, 77, - 0, 0, 59, 82, 84, 0, 0, 89, 83, 219, - 0, 201, 0, 0, 0, 0, 40, 189, 190, 5, - 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 0, 0, 0, 0, 0, 0, 0, - 19, 20, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 178, 40, 193, 0, 216, 136, 133, 132, 134, - 135, 139, 0, 127, 61, 62, 63, 64, 65, 66, - 67, 68, 69, 70, 71, 0, 0, 0, 0, 125, - 0, 0, 0, 81, 151, 88, 86, 0, 0, 205, - 200, 183, 182, 0, 0, 24, 28, 23, 27, 22, - 26, 21, 25, 29, 30, 0, 0, 47, 47, 225, - 0, 0, 214, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 137, 52, - 103, 104, 3, 4, 101, 102, 105, 100, 96, 97, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 99, 98, 52, 58, 58, 85, 150, 144, - 147, 148, 0, 0, 78, 161, 162, 163, 168, 164, - 165, 166, 167, 0, 170, 174, 173, 175, 0, 184, - 0, 0, 0, 221, 0, 223, 218, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 138, 0, 128, 0, 0, 0, 0, - 91, 115, 0, 0, 95, 0, 92, 0, 0, 0, - 0, 126, 79, 80, 143, 145, 0, 50, 87, 0, - 0, 0, 0, 0, 0, 0, 0, 228, 0, 0, - 207, 0, 209, 212, 0, 210, 211, 0, 0, 0, - 206, 0, 226, 0, 0, 0, 54, 52, 218, 0, - 0, 0, 0, 90, 93, 94, 0, 0, 0, 0, - 149, 146, 51, 45, 169, 0, 0, 199, 47, 48, - 47, 196, 217, 0, 0, 0, 0, 202, 203, 204, - 199, 0, 49, 55, 53, 0, 0, 0, 0, 114, - 0, 0, 0, 0, 0, 152, 0, 0, 198, 0, - 0, 222, 224, 0, 0, 0, 208, 213, 0, 227, - 107, 0, 0, 0, 0, 0, 0, 0, 46, 0, - 0, 0, 197, 194, 0, 215, 106, 0, 113, 109, - 110, 111, 112, 0, 187, 0, 0, 0, 195, 0, - 185, 0, 186, 0, 0, 108, 0, 0, 0, 0, - 0, 0, 192, 0, 0, 191, 188, 0, 0, 0 +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const short yyrhs[] = +{ + 143, 0, -1, 5, -1, 6, -1, 3, -1, 4, + -1, 68, -1, 69, -1, 70, -1, 71, -1, 72, + -1, 73, -1, 74, -1, 75, -1, 76, -1, 77, + -1, 78, -1, 79, -1, 80, -1, 81, -1, 91, + -1, 92, -1, 16, -1, 14, -1, 12, -1, 10, + -1, 17, -1, 15, -1, 13, -1, 11, -1, 119, + -1, 120, -1, 18, -1, 19, -1, 152, 98, -1, + -1, 41, -1, 42, -1, 43, -1, 44, -1, -1, + -1, 59, -1, 60, -1, 61, -1, 58, 4, -1, + -1, 54, 4, -1, -1, 99, 54, 4, -1, 34, + 24, -1, -1, 128, -1, -1, 99, 131, 130, -1, + 128, -1, 54, 4, -1, 134, -1, 8, -1, 136, + -1, 8, -1, 136, -1, 9, -1, 10, -1, 11, + -1, 12, -1, 13, -1, 14, -1, 15, -1, 16, + -1, 17, -1, 18, -1, 19, -1, 20, -1, 21, + -1, 45, -1, 135, -1, 165, -1, 100, 4, -1, + 133, 101, 138, 102, -1, 103, 4, 104, 136, 105, + -1, 106, 4, 104, 136, 107, -1, 108, 137, 109, + -1, 108, 109, -1, 136, 110, -1, 136, -1, 137, + 99, 136, -1, 137, -1, 137, 99, 37, -1, 37, + -1, -1, 134, 103, 141, 105, -1, 134, 103, 105, + -1, 134, 111, 24, -1, 134, 106, 141, 107, -1, + 134, 108, 141, 109, -1, 134, 108, 109, -1, 134, + 38, -1, 134, 39, -1, 134, 165, -1, 134, 140, + -1, 134, 26, -1, 119, 114, -1, 120, 4, -1, + 9, 27, -1, 9, 28, -1, 122, 7, -1, 89, + 101, 139, 36, 134, 102, -1, 87, 101, 139, 179, + 102, -1, 90, 101, 139, 99, 139, 99, 139, 102, + -1, 115, 101, 139, 99, 139, 102, -1, 116, 101, + 139, 99, 139, 102, -1, 117, 101, 139, 99, 139, + 102, -1, 118, 101, 139, 99, 139, 102, -1, 94, + 101, 139, 99, 139, 102, -1, 141, 99, 139, -1, + 139, -1, 32, -1, 33, -1, 144, -1, 144, 161, + -1, 144, 162, -1, 144, 25, -1, 145, -1, 145, + 123, 20, 132, -1, 145, 162, -1, -1, 145, 123, + 124, 142, 139, 146, 130, -1, -1, 145, 123, 47, + 142, 134, 147, 130, -1, 145, 48, 149, -1, 145, + 55, 98, 150, -1, -1, 53, -1, 52, -1, 50, + 98, 148, -1, 51, 98, 4, -1, 49, 98, 24, + -1, 103, 151, 105, -1, 151, 99, 24, -1, 24, + -1, -1, 22, -1, 24, -1, 152, -1, -1, 134, + 153, -1, 155, 99, 154, -1, 154, -1, 155, -1, + 155, 99, 37, -1, 37, -1, -1, 125, 132, 152, + 101, 156, 102, 129, 126, -1, 29, -1, 108, -1, + 124, 157, 158, -1, 30, -1, 109, -1, 168, 160, + -1, -1, 31, 163, 157, -1, 3, -1, 4, -1, + 7, -1, 27, -1, 28, -1, 38, -1, 39, -1, + 26, -1, 106, 141, 107, -1, 140, -1, 113, -1, + 152, -1, 165, -1, 164, -1, 134, 166, -1, 168, + 169, -1, 159, 169, -1, 170, 123, 171, -1, 170, + 173, -1, -1, 23, -1, 62, 167, -1, 62, 8, + -1, 63, 21, 166, -1, 63, 9, 166, 99, 21, + 166, 99, 21, 166, -1, 64, 121, 166, 99, 21, + 166, 103, 172, 105, -1, 64, 121, 166, 99, 21, + 166, 103, 105, -1, 65, 125, 132, 166, 101, 176, + 102, 36, 21, 166, 66, 21, 166, -1, 66, -1, + 67, -1, 172, 121, 164, 99, 21, 166, -1, 121, + 164, 99, 21, 166, -1, 123, 178, -1, 134, 103, + 166, 99, 166, 105, -1, 174, 99, 103, 166, 99, + 166, 105, -1, 167, -1, 175, 99, 167, -1, 175, + -1, -1, 57, 56, -1, 56, -1, 115, 134, 166, + 99, 166, -1, 116, 134, 166, 99, 166, -1, 117, + 134, 166, 99, 166, -1, 46, 167, -1, 118, 167, + 99, 167, -1, 89, 167, 36, 134, -1, 90, 167, + 99, 167, 99, 167, -1, 93, 167, 99, 134, -1, + 96, 167, 99, 134, -1, 97, 167, 99, 134, -1, + 94, 167, 99, 167, -1, 95, 167, 99, 167, 99, + 167, -1, 88, 174, -1, 177, 125, 132, 166, 101, + 176, 102, -1, 181, -1, 99, 175, -1, -1, 35, + -1, -1, 82, 134, 127, -1, 82, 134, 99, 15, + 166, 127, -1, 83, 134, 127, -1, 83, 134, 99, + 15, 166, 127, -1, 84, 167, -1, 180, 85, 134, + 166, -1, 180, 86, 167, 99, 134, 166, -1, 87, + 134, 166, 179, -1 }; -static const short yydefgoto[] = { 67, - 225, 239, 240, 241, 242, 166, 167, 196, 168, 18, - 9, 26, 396, 274, 347, 364, 296, 348, 68, 69, - 179, 71, 72, 96, 178, 302, 265, 303, 88, 458, - 1, 2, 245, 220, 150, 38, 84, 153, 73, 316, - 251, 252, 253, 27, 77, 10, 33, 11, 12, 21, - 266, 74, 268, 372, 13, 29, 30, 142, 437, 79, - 203, 399, 400, 143, 144, 328, 145, 146 +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short yyrline[] = +{ + 0, 997, 997, 998, 1005, 1006, 1015, 1015, 1015, 1015, + 1015, 1016, 1016, 1016, 1017, 1017, 1017, 1017, 1017, 1017, + 1019, 1019, 1023, 1023, 1023, 1023, 1024, 1024, 1024, 1024, + 1025, 1025, 1026, 1026, 1029, 1032, 1036, 1037, 1038, 1039, + 1040, 1042, 1043, 1044, 1045, 1046, 1054, 1055, 1060, 1061, + 1068, 1075, 1076, 1081, 1082, 1083, 1087, 1100, 1100, 1101, + 1101, 1103, 1112, 1112, 1112, 1112, 1112, 1112, 1112, 1113, + 1113, 1113, 1113, 1113, 1113, 1114, 1117, 1120, 1126, 1133, + 1145, 1149, 1160, 1169, 1172, 1180, 1184, 1189, 1190, 1193, + 1196, 1206, 1231, 1244, 1272, 1297, 1317, 1329, 1338, 1342, + 1401, 1407, 1415, 1420, 1425, 1428, 1431, 1438, 1448, 1479, + 1486, 1507, 1517, 1522, 1529, 1539, 1542, 1549, 1549, 1559, + 1566, 1570, 1573, 1576, 1589, 1609, 1611, 1611, 1617, 1617, + 1624, 1626, 1628, 1633, 1634, 1636, 1639, 1647, 1652, 1654, + 1658, 1662, 1670, 1670, 1671, 1671, 1673, 1679, 1684, 1690, + 1693, 1698, 1702, 1706, 1792, 1792, 1794, 1802, 1802, 1804, + 1808, 1808, 1817, 1820, 1823, 1826, 1829, 1832, 1835, 1838, + 1841, 1865, 1872, 1875, 1880, 1880, 1886, 1890, 1893, 1901, + 1910, 1914, 1924, 1935, 1938, 1941, 1944, 1947, 1961, 1965, + 2018, 2021, 2027, 2035, 2045, 2052, 2057, 2064, 2068, 2074, + 2074, 2076, 2079, 2085, 2097, 2108, 2118, 2130, 2137, 2144, + 2151, 2156, 2175, 2197, 2205, 2217, 2231, 2288, 2294, 2296, + 2300, 2303, 2309, 2313, 2317, 2321, 2325, 2332, 2342, 2355 }; +#endif -static const short yypact[] = {-32768, - 94, 198,-32768,-32768,-32768,-32768,-32768,-32768, 100, 26, --32768,-32768, -14,-32768,-32768, 96, -77, 80, -47,-32768, - 100, 104,-32768,-32768,-32768, 976, -16,-32768,-32768, 67, --32768,-32768,-32768,-32768, 22, 35, 69,-32768, 62, 976, - 3, 3,-32768,-32768,-32768,-32768,-32768, 76,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 166, 175, 182, 66,-32768, 67, 86,-32768, --32768, -67,-32768,-32768,-32768,-32768,-32768, 1095,-32768, 164, - -34, 187, 169,-32768,-32768,-32768,-32768, 998, 1042,-32768, - 92, 93,-32768,-32768, -67, -3, 98, 729,-32768,-32768, - 998,-32768, 144, 1102, -1, 369, 100,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 998, 998, 998, 998, 998, 998, 998, --32768,-32768, 998, 998, 998, 998, 998, 998, 998, 998, - 998,-32768, 100,-32768, 19,-32768,-32768,-32768,-32768,-32768, --32768,-32768, 4,-32768, 102, 139, 199, 149, 200, 151, - 201, 160, 202, 195, 209, 178, 203, 210, 371,-32768, - 998, 998, 998,-32768, 767,-32768, 109, 117, 549,-32768, --32768, 76,-32768, 549, 549,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768,-32768,-32768, 549, 976, 122, 128,-32768, - 549, 125, 133, 197, 135, 136, 137, 138, 148, 150, - 549, 549, 549, 153, 976, 998, 998, 219,-32768, 156, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, - 147, 157, 161, 165, 833, 1042, 504, 233, 168, 174, - 176, 177,-32768,-32768, 156, -40, -43, -67,-32768, 67, --32768, 162, 163, 871,-32768,-32768,-32768,-32768,-32768,-32768, --32768,-32768,-32768, 1042,-32768,-32768,-32768,-32768, 171,-32768, - 180, 549, -4,-32768, 7,-32768, 181, 549, 173, 998, - 998, 998, 998, 998, 998, 998, 190, 191, 193, 998, - 549, 549, 194,-32768, 39,-32768, 1042, 1042, 1042, 1042, --32768,-32768, 45, 27,-32768, -2,-32768, 1042, 1042, 1042, - 1042,-32768,-32768,-32768,-32768,-32768, 938, 247,-32768, 32, - 246, 265, 196, 549, 290, 549, 998,-32768, 206, 549, --32768, 220,-32768,-32768, 221,-32768,-32768, 549, 549, 549, --32768, 222,-32768, 998, 271, 295,-32768, 156, 181, 264, - 223, 225, 1042,-32768,-32768,-32768, 227, 229, 230, 232, --32768,-32768,-32768, 267,-32768, 549, 549, 998, 235,-32768, - 235,-32768, 236, 549, 237, 998, 998,-32768,-32768,-32768, - 998, 549,-32768,-32768,-32768, 242, 998, 1042, 1042,-32768, - 1042, 1042, 1042, 1042, 297,-32768, 238, 244, 236, 243, - 294,-32768,-32768, 998, 245, 549,-32768,-32768, 249,-32768, --32768, 250, 254, 253, 255, 256, 257, 258,-32768, 328, - 13, 320,-32768,-32768, 259,-32768,-32768, 1042,-32768,-32768, --32768,-32768,-32768, 549,-32768, 630, 43, 348,-32768, 268, --32768, 272,-32768, 630, 549,-32768, 351, 274, 308, 549, - 354, 366,-32768, 549, 549,-32768,-32768, 388, 389,-32768 +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "ESINT64VAL", "EUINT64VAL", "SINTVAL", + "UINTVAL", "FPVAL", "VOID", "BOOL", "SBYTE", "UBYTE", "SHORT", "USHORT", + "INT", "UINT", "LONG", "ULONG", "FLOAT", "DOUBLE", "TYPE", "LABEL", + "VAR_ID", "LABELSTR", "STRINGCONSTANT", "IMPLEMENTATION", + "ZEROINITIALIZER", "TRUETOK", "FALSETOK", "BEGINTOK", "ENDTOK", + "DECLARE", "GLOBAL", "CONSTANT", "SECTION", "VOLATILE", "TO", + "DOTDOTDOT", "NULL_TOK", "UNDEF", "CONST", "INTERNAL", "LINKONCE", + "WEAK", "APPENDING", "OPAQUE", "NOT", "EXTERNAL", "TARGET", "TRIPLE", + "ENDIAN", "POINTERSIZE", "LITTLE", "BIG", "ALIGN", "DEPLIBS", "CALL", + "TAIL", "CC_TOK", "CCC_TOK", "FASTCC_TOK", "COLDCC_TOK", "RET", "BR", + "SWITCH", "INVOKE", "UNWIND", "UNREACHABLE", "ADD", "SUB", "MUL", "DIV", + "REM", "AND", "OR", "XOR", "SETLE", "SETGE", "SETLT", "SETGT", "SETEQ", + "SETNE", "MALLOC", "ALLOCA", "FREE", "LOAD", "STORE", "GETELEMENTPTR", + "PHI_TOK", "CAST", "SELECT", "SHL", "SHR", "VAARG", "EXTRACTELEMENT", + "INSERTELEMENT", "VAARG_old", "VANEXT_old", "'='", "','", "'\\\\'", + "'('", "')'", "'['", "'x'", "']'", "'<'", "'>'", "'{'", "'}'", "'*'", + "'c'", "$accept", "INTVAL", "EINT64VAL", "ArithmeticOps", "LogicalOps", + "SetCondOps", "ShiftOps", "SIntType", "UIntType", "IntType", "FPType", + "OptAssign", "OptLinkage", "OptCallingConv", "OptAlign", "OptCAlign", + "SectionString", "OptSection", "GlobalVarAttributes", + "GlobalVarAttribute", "TypesV", "UpRTypesV", "Types", "PrimType", + "UpRTypes", "TypeListI", "ArgTypeListI", "ConstVal", "ConstExpr", + "ConstVector", "GlobalType", "Module", "FunctionList", "ConstPool", "@1", + "@2", "BigOrLittle", "TargetDefinition", "LibrariesDefinition", + "LibList", "Name", "OptName", "ArgVal", "ArgListH", "ArgList", + "FunctionHeaderH", "BEGIN", "FunctionHeader", "END", "Function", + "FunctionProto", "@3", "ConstValueRef", "SymbolicValueRef", "ValueRef", + "ResolvedVal", "BasicBlockList", "BasicBlock", "InstructionList", + "BBTerminatorInst", "JumpTable", "Inst", "PHIList", "ValueRefList", + "ValueRefListE", "OptTailCall", "InstVal", "IndexList", "OptVolatile", + "MemoryInst", 0 }; +#endif -static const short yypgoto[] = {-32768, --32768, 312, 313, 314, 316, -105, -104, -404,-32768, 368, - 378, -75,-32768, -193, 81,-32768, -238,-32768, -35,-32768, - -26,-32768, -56, 302,-32768, -85, 234, -198, 362,-32768, --32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, 1,-32768, - 88,-32768,-32768, 387,-32768,-32768,-32768,-32768, 409,-32768, - -304, -28, 129, -89,-32768, 399,-32768,-32768,-32768,-32768, --32768, 87, 34,-32768,-32768, 64,-32768,-32768 +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 61, 44, + 92, 40, 41, 91, 120, 93, 60, 62, 123, 125, + 42, 99 }; +# endif +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 112, 113, 113, 114, 114, 115, 115, 115, 115, + 115, 116, 116, 116, 117, 117, 117, 117, 117, 117, + 118, 118, 119, 119, 119, 119, 120, 120, 120, 120, + 121, 121, 122, 122, 123, 123, 124, 124, 124, 124, + 124, 125, 125, 125, 125, 125, 126, 126, 127, 127, + 128, 129, 129, 130, 130, 131, 131, 132, 132, 133, + 133, 134, 135, 135, 135, 135, 135, 135, 135, 135, + 135, 135, 135, 135, 135, 136, 136, 136, 136, 136, + 136, 136, 136, 136, 136, 137, 137, 138, 138, 138, + 138, 139, 139, 139, 139, 139, 139, 139, 139, 139, + 139, 139, 139, 139, 139, 139, 139, 140, 140, 140, + 140, 140, 140, 140, 140, 141, 141, 142, 142, 143, + 144, 144, 144, 144, 145, 145, 146, 145, 147, 145, + 145, 145, 145, 148, 148, 149, 149, 149, 150, 151, + 151, 151, 152, 152, 153, 153, 154, 155, 155, 156, + 156, 156, 156, 157, 158, 158, 159, 160, 160, 161, + 163, 162, 164, 164, 164, 164, 164, 164, 164, 164, + 164, 164, 165, 165, 166, 166, 167, 168, 168, 169, + 170, 170, 170, 171, 171, 171, 171, 171, 171, 171, + 171, 171, 172, 172, 173, 174, 174, 175, 175, 176, + 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, + 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, + 180, 180, 181, 181, 181, 181, 181, 181, 181, 181 +}; -#define YYLAST 1210 - +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 2, 0, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 2, 0, 2, 0, 3, + 2, 0, 1, 0, 3, 1, 2, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, + 5, 5, 3, 2, 2, 1, 3, 1, 3, 1, + 0, 4, 3, 3, 4, 4, 3, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 6, 5, 8, + 6, 6, 6, 6, 6, 3, 1, 1, 1, 1, + 2, 2, 2, 1, 4, 2, 0, 7, 0, 7, + 3, 4, 0, 1, 1, 3, 3, 3, 3, 3, + 1, 0, 1, 1, 1, 0, 2, 3, 1, 1, + 3, 1, 0, 8, 1, 1, 3, 1, 1, 2, + 0, 3, 1, 1, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 2, 2, 2, 3, + 2, 0, 1, 2, 2, 3, 9, 9, 8, 13, + 1, 1, 6, 5, 2, 6, 7, 1, 3, 1, + 0, 2, 1, 5, 5, 5, 2, 4, 4, 6, + 4, 4, 4, 4, 6, 2, 7, 1, 2, 0, + 1, 0, 3, 6, 3, 6, 2, 4, 6, 4 +}; -static const short yytable[] = { 70, - 194, 195, 19, 170, 85, 276, 312, 184, 28, 95, - 324, 180, 75, 70, 183, 31, 436, 148, 149, 185, - 39, 326, 186, 187, 188, 189, 190, 191, 192, 193, - 19, 197, 444, -58, 86, 87, 200, 304, 306, 204, - 205, 95, 99, 206, 207, 208, 209, 210, 28, 325, - 43, 214, 186, 187, 188, 189, 190, 191, 192, 193, - 325, 154, 169, 314, 313, 320, 99, 215, 97, 99, - 46, 47, 345, 93, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 14, 14, 15, - 15, 76, 346, -118, 32, 173, 353, 198, 199, 40, - 201, 202, 218, 216, 217, 174, 356, 45, 219, 385, - 62, 211, 212, 213, 246, 247, 248, 435, 3, 80, - 5, 6, 7, 8, 4, 353, 41, 293, 221, 222, - 353, 442, 81, 355, 5, 6, 7, 8, 365, 448, - 244, -24, -24, 353, 35, 36, 37, 443, 250, 354, - 267, -23, -23, -22, -22, 267, 267, 22, 23, 24, - 25, 272, -21, -21, 83, 63, 82, 267, 64, 90, - 70, 65, 267, 66, 94, 402, -59, 403, 91, 291, - 223, 224, 267, 267, 267, 92, 98, 147, 70, 292, - 151, 332, 152, 334, 335, 171, 172, 248, 175, 181, - 341, -31, -28, -27, -26, -25, 226, 254, 169, 169, - 169, 349, 350, 351, 352, -32, 227, -34, 255, 14, - 273, 15, 357, 358, 359, 360, 275, 278, 4, -34, - -34, 279, 280, 281, 282, 283, 284, 169, -34, -34, - -34, -34, 294, 267, -34, 16, 285, 297, 286, 267, - 315, 290, 17, 331, 295, 333, 307, 298, 336, 337, - 317, 299, 267, 267, 318, 300, 366, 390, 308, 321, - 169, 169, 169, 169, 309, 330, 310, 311, 322, 327, - 345, 169, 169, 169, 169, 367, 407, 408, 338, 339, - 250, 340, 344, 370, 383, 267, 368, 267, 384, 387, - 419, 267, 413, 414, 374, 415, 416, 417, 418, 267, - 267, 267, 269, 270, 423, 194, 195, 382, 376, 377, - 395, 388, 381, 389, 271, 391, 169, 392, 393, 277, - 394, 194, 195, 401, 404, 406, 420, 267, 267, 287, - 288, 289, 440, 411, 422, 267, 421, 325, 434, 424, - 426, 427, 428, 267, 429, 438, 430, 431, 432, 433, - 412, 169, 169, 439, 169, 169, 169, 169, 445, 446, - 447, 450, 451, 452, 454, 46, 47, 267, 186, 187, - 188, 189, 190, 191, 192, 193, 455, 459, 460, 138, - 139, 140, 14, 141, 15, 42, 228, 78, 363, 177, - 323, 169, 243, 89, 362, 267, 329, 44, 229, 230, - 20, 34, 386, 373, 409, 0, 267, 0, 0, 342, - 343, 267, 0, 0, 0, 267, 267, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 110, 111, - 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, - 122, 123, 369, 0, 371, 0, 0, 231, 375, 232, - 233, 131, 132, 0, 234, 0, 378, 379, 380, 0, - 0, 0, 0, 235, 0, 0, 236, 0, 237, 0, - 0, 238, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 397, 398, 0, 0, 0, 0, - 0, 0, 405, 0, 0, 0, 0, 0, 46, 47, - 410, 93, 155, 156, 157, 158, 159, 160, 161, 162, - 163, 164, 165, 60, 61, 14, 0, 15, 0, 0, - 0, 0, 0, 0, 425, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, - 0, 256, 257, 46, 47, 258, 0, 0, 0, 0, - 0, 0, 441, 0, 0, 0, 0, 0, 0, 0, - 14, 0, 15, 449, 259, 260, 261, 0, 453, 0, - 0, 0, 456, 457, 0, 0, 262, 263, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 63, 0, 0, 64, 0, 0, 65, - 0, 66, 305, 0, 0, 0, 110, 111, 112, 113, - 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, - 0, 0, 256, 257, 0, 231, 258, 232, 233, 131, - 132, 0, 234, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 264, 259, 260, 261, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 262, 263, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 110, 111, 112, - 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, - 123, 0, 0, 0, 0, 0, 231, 0, 232, 233, - 131, 132, 0, 234, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 47, 264, 93, 49, 50, 51, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, - 14, 0, 15, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 176, 0, 0, 0, 0, - 0, 46, 47, 62, 93, 49, 50, 51, 52, 53, - 54, 55, 56, 57, 58, 59, 60, 61, 14, 0, - 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 249, 0, 0, 0, 0, 0, 0, - 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, - 0, 64, 0, 0, 65, 0, 66, 46, 47, 0, - 93, 155, 156, 157, 158, 159, 160, 161, 162, 163, - 164, 165, 60, 61, 14, 0, 15, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 63, 0, 0, 64, - 0, 0, 65, 0, 66, 46, 47, 62, 93, 49, - 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, - 60, 61, 14, 0, 15, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 319, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 63, 0, 0, 64, 0, 301, 65, 0, - 66, 0, 46, 47, 0, 93, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 14, - 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 63, 0, 0, 64, 361, 0, 65, 0, 66, 0, - 46, 47, 62, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61, 14, 0, 15, - 0, 0, 46, 47, 0, 93, 49, 50, 51, 52, - 53, 54, 55, 56, 57, 58, 59, 60, 61, 14, - 62, 15, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, - 64, 0, 62, 65, 0, 66, 46, 47, 0, 93, - 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, - 165, 60, 61, 14, 0, 15, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 63, 0, 0, 64, 0, - 0, 65, 0, 66, 0, 0, 62, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, - 64, 0, 0, 65, 0, 66, 46, 47, 0, 182, - 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, - 59, 60, 61, 14, 0, 15, 0, 0, 0, 100, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 101, 63, 0, 0, 64, 0, 62, 65, 0, 66, - 102, 103, 0, 0, 0, 0, 104, 105, 106, 107, - 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, - 118, 119, 120, 121, 122, 123, 124, 125, 126, 0, - 0, 127, 128, 129, 130, 131, 132, 133, 134, 135, - 136, 137, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 63, 0, 0, 64, 0, 0, 65, 0, 66 +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 132, 0, 40, 123, 1, 122, 160, 36, 37, 38, + 39, 41, 181, 120, 121, 181, 142, 143, 0, 0, + 40, 0, 125, 41, 0, 42, 43, 44, 0, 0, + 182, 178, 35, 157, 158, 159, 177, 0, 0, 0, + 130, 0, 0, 0, 0, 34, 161, 45, 2, 3, + 58, 62, 63, 64, 65, 66, 67, 68, 69, 70, + 71, 72, 73, 74, 75, 0, 0, 0, 0, 172, + 0, 0, 57, 76, 61, 173, 77, 154, 155, 156, + 221, 180, 0, 0, 0, 141, 131, 124, 117, 118, + 0, 0, 78, 0, 0, 60, 83, 85, 0, 0, + 90, 84, 220, 0, 202, 0, 0, 0, 0, 41, + 190, 191, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, + 0, 0, 0, 20, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 179, 41, 194, 0, 217, 137, + 134, 133, 135, 136, 140, 0, 128, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 0, 0, + 0, 0, 126, 0, 0, 0, 82, 152, 89, 87, + 0, 0, 206, 201, 184, 183, 0, 0, 25, 29, + 24, 28, 23, 27, 22, 26, 30, 31, 0, 0, + 48, 48, 226, 0, 0, 215, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 53, 104, 105, 4, 5, 102, 103, 106, + 101, 97, 98, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 100, 99, 53, 59, 59, + 86, 151, 145, 148, 149, 0, 0, 79, 162, 163, + 164, 169, 165, 166, 167, 168, 0, 171, 175, 174, + 176, 0, 185, 0, 0, 0, 222, 0, 224, 219, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 139, 0, 129, 0, + 0, 0, 0, 92, 116, 0, 0, 96, 0, 93, + 0, 0, 0, 0, 127, 80, 81, 144, 146, 0, + 51, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 229, 0, 0, 208, 0, 210, 213, 0, 211, 212, + 0, 0, 0, 207, 0, 227, 0, 0, 0, 55, + 53, 219, 0, 0, 0, 0, 91, 94, 95, 0, + 0, 0, 0, 150, 147, 52, 46, 170, 0, 0, + 200, 48, 49, 48, 197, 218, 0, 0, 0, 0, + 203, 204, 205, 200, 0, 50, 56, 54, 0, 0, + 0, 0, 115, 0, 0, 0, 0, 0, 153, 0, + 0, 199, 0, 0, 223, 225, 0, 0, 0, 209, + 214, 0, 228, 108, 0, 0, 0, 0, 0, 0, + 0, 47, 0, 0, 0, 198, 195, 0, 216, 107, + 0, 114, 110, 111, 112, 113, 0, 188, 0, 0, + 0, 196, 0, 186, 0, 187, 0, 0, 109, 0, + 0, 0, 0, 0, 0, 193, 0, 0, 192, 189 }; -static const short yycheck[] = { 26, - 106, 106, 2, 89, 40, 199, 245, 9, 23, 66, - 15, 101, 29, 40, 104, 30, 421, 52, 53, 21, - 98, 15, 10, 11, 12, 13, 14, 15, 16, 17, - 30, 107, 437, 101, 32, 33, 126, 236, 237, 129, - 130, 98, 110, 133, 134, 135, 136, 137, 23, 54, - 98, 141, 10, 11, 12, 13, 14, 15, 16, 17, - 54, 88, 89, 107, 105, 264, 110, 143, 68, 110, - 5, 6, 34, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 22, 24, - 24, 108, 54, 0, 109, 99, 99, 124, 125, 20, - 127, 128, 99, 85, 86, 109, 109, 4, 105, 348, - 45, 138, 139, 140, 171, 172, 173, 105, 25, 98, - 41, 42, 43, 44, 31, 99, 47, 217, 27, 28, - 99, 436, 98, 107, 41, 42, 43, 44, 107, 444, - 169, 3, 4, 99, 49, 50, 51, 105, 175, 105, - 179, 3, 4, 3, 4, 184, 185, 58, 59, 60, - 61, 197, 3, 4, 103, 100, 98, 196, 103, 4, - 197, 106, 201, 108, 109, 369, 101, 371, 4, 215, - 3, 4, 211, 212, 213, 4, 101, 24, 215, 216, - 4, 281, 24, 283, 284, 104, 104, 254, 101, 56, - 290, 7, 4, 4, 4, 4, 4, 99, 235, 236, - 237, 297, 298, 299, 300, 7, 7, 20, 102, 22, - 99, 24, 308, 309, 310, 311, 99, 103, 31, 32, - 33, 99, 36, 99, 99, 99, 99, 264, 41, 42, - 43, 44, 24, 272, 47, 48, 99, 101, 99, 278, - 250, 99, 55, 280, 99, 282, 24, 101, 285, 286, - 99, 101, 291, 292, 102, 101, 21, 353, 101, 99, - 297, 298, 299, 300, 101, 103, 101, 101, 99, 99, - 34, 308, 309, 310, 311, 21, 376, 377, 99, 99, - 317, 99, 99, 4, 24, 324, 101, 326, 4, 36, - 4, 330, 388, 389, 99, 391, 392, 393, 394, 338, - 339, 340, 184, 185, 404, 421, 421, 344, 99, 99, - 54, 99, 101, 99, 196, 99, 353, 99, 99, 201, - 99, 437, 437, 99, 99, 99, 99, 366, 367, 211, - 212, 213, 428, 102, 102, 374, 103, 54, 21, 105, - 102, 102, 99, 382, 102, 36, 102, 102, 102, 102, - 387, 388, 389, 105, 391, 392, 393, 394, 21, 102, - 99, 21, 99, 66, 21, 5, 6, 406, 10, 11, - 12, 13, 14, 15, 16, 17, 21, 0, 0, 78, - 78, 78, 22, 78, 24, 18, 26, 30, 318, 98, - 272, 428, 169, 42, 317, 434, 278, 21, 38, 39, - 2, 13, 349, 327, 381, -1, 445, -1, -1, 291, - 292, 450, -1, -1, -1, 454, 455, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 68, 69, - 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, - 80, 81, 324, -1, 326, -1, -1, 87, 330, 89, - 90, 91, 92, -1, 94, -1, 338, 339, 340, -1, - -1, -1, -1, 103, -1, -1, 106, -1, 108, -1, - -1, 111, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 366, 367, -1, -1, -1, -1, - -1, -1, 374, -1, -1, -1, -1, -1, 5, 6, - 382, 8, 9, 10, 11, 12, 13, 14, 15, 16, - 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, - -1, -1, -1, -1, 406, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, - -1, 3, 4, 5, 6, 7, -1, -1, -1, -1, - -1, -1, 434, -1, -1, -1, -1, -1, -1, -1, - 22, -1, 24, 445, 26, 27, 28, -1, 450, -1, - -1, -1, 454, 455, -1, -1, 38, 39, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 100, -1, -1, 103, -1, -1, 106, - -1, 108, 109, -1, -1, -1, 68, 69, 70, 71, - 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, - -1, -1, 3, 4, -1, 87, 7, 89, 90, 91, - 92, -1, 94, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, 106, 26, 27, 28, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 38, 39, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 68, 69, 70, - 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, - 81, -1, -1, -1, -1, -1, 87, -1, 89, 90, - 91, 92, -1, 94, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 5, 6, 106, 8, 9, 10, 11, - 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, - -1, 5, 6, 45, 8, 9, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, - 24, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, 37, -1, -1, -1, -1, -1, -1, - -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, 100, -1, - -1, 103, -1, -1, 106, -1, 108, 5, 6, -1, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, - 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, - -1, -1, -1, -1, -1, -1, 100, -1, -1, 103, - -1, -1, 106, -1, 108, 5, 6, 45, 8, 9, - 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, - 20, 21, 22, -1, 24, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 37, -1, -1, - -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, 100, -1, -1, 103, -1, 105, 106, -1, - 108, -1, 5, 6, -1, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, - 100, -1, -1, 103, 37, -1, 106, -1, 108, -1, - 5, 6, 45, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, -1, 24, - -1, -1, 5, 6, -1, 8, 9, 10, 11, 12, - 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 45, 24, -1, -1, -1, -1, -1, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 100, -1, -1, - 103, -1, 45, 106, -1, 108, 5, 6, -1, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, - -1, -1, -1, -1, -1, 100, -1, -1, 103, -1, - -1, 106, -1, 108, -1, -1, 45, -1, -1, -1, - -1, -1, -1, -1, -1, -1, -1, 100, -1, -1, - 103, -1, -1, 106, -1, 108, 5, 6, -1, 8, - 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, -1, 24, -1, -1, -1, 35, - -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, - 46, 100, -1, -1, 103, -1, 45, 106, -1, 108, - 56, 57, -1, -1, -1, -1, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, - 76, 77, 78, 79, 80, 81, 82, 83, 84, -1, - -1, 87, 88, 89, 90, 91, 92, 93, 94, 95, - 96, 97, -1, -1, -1, -1, -1, -1, -1, -1, - -1, 100, -1, -1, 103, -1, -1, 106, -1, 108 +/* YYDEFGOTO[NTERM-NUM]. */ +static const short yydefgoto[] = +{ + -1, 69, 227, 241, 242, 243, 244, 168, 169, 198, + 170, 20, 11, 28, 398, 276, 349, 366, 298, 350, + 70, 71, 181, 73, 74, 98, 180, 304, 267, 305, + 90, 1, 2, 3, 247, 222, 152, 40, 86, 155, + 75, 318, 253, 254, 255, 29, 79, 12, 35, 13, + 14, 23, 268, 76, 270, 374, 15, 31, 32, 144, + 439, 81, 205, 401, 402, 145, 146, 330, 147, 148 }; -/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ -#line 3 "/usr/share/bison.simple" -/* This file comes from bison-1.28. */ -/* Skeleton output parser for bison, - Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -407 +static const short yypact[] = +{ + -407, 19, 94, 198, -407, -407, -407, -407, -407, -407, + -407, 71, 28, -407, -407, -14, -407, -407, 58, -7, + 80, 22, -407, 71, 60, -407, -407, -407, 976, -16, + -407, -407, 121, -407, -407, -407, -407, 46, 69, 72, + -407, -35, 976, 3, 3, -407, -407, -407, -407, -407, + 49, -407, -407, -407, -407, -407, -407, -407, -407, -407, + -407, -407, -407, -407, -407, 161, 173, 175, 66, -407, + 121, 87, -407, -407, -67, -407, -407, -407, -407, -407, + 1095, -407, 167, 52, 189, 172, -407, -407, -407, -407, + 998, 1042, -407, 93, 95, -407, -407, -67, -6, 99, + 729, -407, -407, 998, -407, 146, 1102, -1, 369, 71, + -407, -407, -407, -407, -407, -407, -407, -407, -407, -407, + -407, -407, -407, -407, -407, -407, 998, 998, 998, 998, + 998, 998, 998, -407, -407, 998, 998, 998, 998, 998, + 998, 998, 998, 998, -407, 71, -407, 67, -407, -407, + -407, -407, -407, -407, -407, 34, -407, 131, 151, 199, + 157, 200, 160, 201, 178, 202, 209, 210, 183, 203, + 212, 371, -407, 998, 998, 998, -407, 767, -407, 109, + 119, 549, -407, -407, 49, -407, 549, 549, -407, -407, + -407, -407, -407, -407, -407, -407, -407, -407, 549, 976, + 128, 129, -407, 549, 130, 133, 207, 135, 136, 137, + 138, 148, 149, 549, 549, 549, 150, 976, 998, 998, + 227, -407, 156, -407, -407, -407, -407, -407, -407, -407, + -407, -407, -407, 164, 165, 166, 168, 833, 1042, 504, + 233, 169, 174, 176, 177, -407, -407, 156, 37, -89, + -67, -407, 121, -407, 159, 179, 871, -407, -407, -407, + -407, -407, -407, -407, -407, -407, 1042, -407, -407, -407, + -407, 162, -407, 163, 549, -4, -407, 7, -407, 180, + 549, 186, 998, 998, 998, 998, 998, 998, 998, 181, + 187, 191, 998, 549, 549, 193, -407, 15, -407, 1042, + 1042, 1042, 1042, -407, -407, 41, -34, -407, -3, -407, + 1042, 1042, 1042, 1042, -407, -407, -407, -407, -407, 938, + 242, -407, -10, 272, 273, 194, 549, 293, 549, 998, + -407, 206, 549, -407, 220, -407, -407, 221, -407, -407, + 549, 549, 549, -407, 222, -407, 998, 275, 296, -407, + 156, 180, 265, 223, 225, 1042, -407, -407, -407, 229, + 230, 232, 235, -407, -407, -407, 267, -407, 549, 549, + 998, 236, -407, 236, -407, 237, 549, 238, 998, 998, + -407, -407, -407, 998, 549, -407, -407, -407, 224, 998, + 1042, 1042, -407, 1042, 1042, 1042, 1042, 340, -407, 246, + 244, 237, 247, 294, -407, -407, 998, 245, 549, -407, + -407, 249, -407, -407, 250, 254, 253, 255, 256, 257, + 258, -407, 335, 13, 328, -407, -407, 264, -407, -407, + 1042, -407, -407, -407, -407, -407, 549, -407, 630, 43, + 349, -407, 269, -407, 274, -407, 630, 549, -407, 351, + 276, 308, 549, 366, 367, -407, 549, 549, -407, -407 +}; - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. +/* YYPGOTO[NTERM-NUM]. */ +static const short yypgoto[] = +{ + -407, -407, -407, 309, 310, 311, 312, -107, -106, -406, + -407, 362, 376, -78, -407, -195, 78, -407, -240, -407, + -37, -407, -28, -407, -58, 299, -407, -87, 234, -200, + 356, -407, -407, -407, -407, -407, -407, -407, -407, -407, + 0, -407, 84, -407, -407, 381, -407, -407, -407, -407, + 405, -407, -312, -30, 127, -91, -407, 396, -407, -407, + -407, -407, -407, 83, 30, -407, -407, 63, -407, -407 +}; - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -120 +static const short yytable[] = +{ + 72, 196, 197, 21, 172, 87, 278, 314, 186, 30, + 97, 326, 182, 77, 72, 185, 33, 438, 316, 4, + 187, 101, 328, 188, 189, 190, 191, 192, 193, 194, + 195, 199, 21, 446, -59, 88, 89, 202, 306, 308, + 206, 207, 97, 101, 208, 209, 210, 211, 212, 347, + 327, 30, 216, 188, 189, 190, 191, 192, 193, 194, + 195, 327, 156, 171, 47, 355, 322, 217, 85, 348, + 99, 48, 49, 357, 95, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 16, 355, + 17, 41, 78, 175, -119, 34, 355, 367, 200, 201, + 42, 203, 204, 176, 150, 151, 358, 37, 38, 39, + 387, 64, 213, 214, 215, 248, 249, 250, 437, 5, + 45, 7, 8, 9, 10, 6, 444, 43, 295, 24, + 25, 26, 27, 220, 450, 7, 8, 9, 10, 221, + 355, 246, 315, 16, 82, 17, 356, 101, 445, 252, + -60, 269, 218, 219, -25, -25, 269, 269, 223, 224, + -24, -24, 274, -23, -23, 92, 65, 83, 269, 66, + 84, 72, 67, 269, 68, 96, 404, 93, 405, 94, + 293, -22, -22, 269, 269, 269, 225, 226, 100, 72, + 294, 149, 334, 153, 336, 337, 154, 173, 250, 174, + 177, 343, 183, -29, -28, -27, -26, 228, 256, 171, + 171, 171, 351, 352, 353, 354, -32, -33, -35, 229, + 16, 257, 17, 359, 360, 361, 362, 275, 277, 6, + -35, -35, 281, 280, 283, 284, 285, 286, 171, -35, + -35, -35, -35, 282, 269, -35, 18, 287, 288, 292, + 269, 296, 317, 19, 333, 297, 335, 309, 319, 338, + 339, 323, 324, 269, 269, 299, 300, 301, 392, 302, + 310, 171, 171, 171, 171, 311, 347, 312, 313, 329, + 340, 320, 171, 171, 171, 171, 341, 409, 410, 332, + 342, 252, 346, 368, 369, 370, 269, 372, 269, 385, + 386, 389, 269, 415, 416, 376, 417, 418, 419, 420, + 269, 269, 269, 271, 272, 425, 196, 197, 384, 378, + 379, 397, 390, 383, 391, 273, 413, 171, 393, 394, + 279, 395, 196, 197, 396, 403, 406, 408, 269, 269, + 289, 290, 291, 442, 421, 422, 269, 423, 327, 424, + 426, 428, 429, 430, 269, 431, 436, 432, 433, 434, + 435, 414, 171, 171, 440, 171, 171, 171, 171, 441, + 447, 448, 452, 449, 454, 453, 48, 49, 269, 188, + 189, 190, 191, 192, 193, 194, 195, 456, 457, 140, + 141, 142, 143, 16, 80, 17, 44, 230, 365, 179, + 91, 325, 171, 364, 46, 245, 269, 331, 22, 231, + 232, 36, 375, 411, 388, 0, 0, 269, 0, 0, + 344, 345, 269, 0, 0, 0, 269, 269, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, + 123, 124, 125, 371, 0, 373, 0, 0, 233, 377, + 234, 235, 133, 134, 0, 236, 0, 380, 381, 382, + 0, 0, 0, 0, 237, 0, 0, 238, 0, 239, + 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 399, 400, 0, 0, 0, + 0, 0, 0, 407, 0, 0, 0, 0, 0, 48, + 49, 412, 95, 157, 158, 159, 160, 161, 162, 163, + 164, 165, 166, 167, 62, 63, 16, 0, 17, 0, + 0, 0, 0, 0, 0, 427, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, + 0, 0, 258, 259, 48, 49, 260, 0, 0, 0, + 0, 0, 0, 443, 0, 0, 0, 0, 0, 0, + 0, 16, 0, 17, 451, 261, 262, 263, 0, 455, + 0, 0, 0, 458, 459, 0, 0, 264, 265, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 65, 0, 0, 66, 0, 0, + 67, 0, 68, 307, 0, 0, 0, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 0, 0, 258, 259, 0, 233, 260, 234, 235, + 133, 134, 0, 236, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 266, 261, 262, 263, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 264, 265, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 112, 113, + 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, + 124, 125, 0, 0, 0, 0, 0, 233, 0, 234, + 235, 133, 134, 0, 236, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 48, 49, 266, 95, 51, 52, + 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 16, 0, 17, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 178, 0, 0, 0, + 0, 0, 48, 49, 64, 95, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 16, + 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 251, 0, 0, 0, 0, 0, + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 66, 0, 0, 67, 0, 68, 48, 49, + 0, 95, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 62, 63, 16, 0, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 65, 0, 0, + 66, 0, 0, 67, 0, 68, 48, 49, 64, 95, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, + 61, 62, 63, 16, 0, 17, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 321, 0, + 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 65, 0, 0, 66, 0, 303, 67, + 0, 68, 0, 48, 49, 0, 95, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 16, 0, 17, 0, 0, 0, 0, 0, 0, 0, + 0, 65, 0, 0, 66, 363, 0, 67, 0, 68, + 0, 48, 49, 64, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, 16, 0, + 17, 0, 0, 48, 49, 0, 95, 51, 52, 53, + 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, + 16, 64, 17, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, + 0, 66, 0, 64, 67, 0, 68, 48, 49, 0, + 95, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 62, 63, 16, 0, 17, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 65, 0, 0, 66, + 0, 0, 67, 0, 68, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 65, 0, + 0, 66, 0, 0, 67, 0, 68, 48, 49, 0, + 184, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 16, 0, 17, 0, 0, 0, + 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 103, 65, 0, 0, 66, 0, 64, 67, 0, + 68, 104, 105, 0, 0, 0, 0, 106, 107, 108, + 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, + 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, + 0, 0, 129, 130, 131, 132, 133, 134, 135, 136, + 137, 138, 139, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 65, 0, 0, 66, 0, 0, 67, 0, + 68 +}; - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ +static const short yycheck[] = +{ + 28, 108, 108, 3, 91, 42, 201, 247, 9, 23, + 68, 15, 103, 29, 42, 106, 30, 423, 107, 0, + 21, 110, 15, 10, 11, 12, 13, 14, 15, 16, + 17, 109, 32, 439, 101, 32, 33, 128, 238, 239, + 131, 132, 100, 110, 135, 136, 137, 138, 139, 34, + 54, 23, 143, 10, 11, 12, 13, 14, 15, 16, + 17, 54, 90, 91, 4, 99, 266, 145, 103, 54, + 70, 5, 6, 107, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, 99, + 24, 98, 108, 99, 0, 109, 99, 107, 126, 127, + 20, 129, 130, 109, 52, 53, 109, 49, 50, 51, + 350, 45, 140, 141, 142, 173, 174, 175, 105, 25, + 98, 41, 42, 43, 44, 31, 438, 47, 219, 58, + 59, 60, 61, 99, 446, 41, 42, 43, 44, 105, + 99, 171, 105, 22, 98, 24, 105, 110, 105, 177, + 101, 181, 85, 86, 3, 4, 186, 187, 27, 28, + 3, 4, 199, 3, 4, 4, 100, 98, 198, 103, + 98, 199, 106, 203, 108, 109, 371, 4, 373, 4, + 217, 3, 4, 213, 214, 215, 3, 4, 101, 217, + 218, 24, 283, 4, 285, 286, 24, 104, 256, 104, + 101, 292, 56, 4, 4, 4, 4, 4, 99, 237, + 238, 239, 299, 300, 301, 302, 7, 7, 20, 7, + 22, 102, 24, 310, 311, 312, 313, 99, 99, 31, + 32, 33, 99, 103, 99, 99, 99, 99, 266, 41, + 42, 43, 44, 36, 274, 47, 48, 99, 99, 99, + 280, 24, 252, 55, 282, 99, 284, 24, 99, 287, + 288, 99, 99, 293, 294, 101, 101, 101, 355, 101, + 101, 299, 300, 301, 302, 101, 34, 101, 101, 99, + 99, 102, 310, 311, 312, 313, 99, 378, 379, 103, + 99, 319, 99, 21, 21, 101, 326, 4, 328, 24, + 4, 36, 332, 390, 391, 99, 393, 394, 395, 396, + 340, 341, 342, 186, 187, 406, 423, 423, 346, 99, + 99, 54, 99, 101, 99, 198, 102, 355, 99, 99, + 203, 99, 439, 439, 99, 99, 99, 99, 368, 369, + 213, 214, 215, 430, 4, 99, 376, 103, 54, 102, + 105, 102, 102, 99, 384, 102, 21, 102, 102, 102, + 102, 389, 390, 391, 36, 393, 394, 395, 396, 105, + 21, 102, 21, 99, 66, 99, 5, 6, 408, 10, + 11, 12, 13, 14, 15, 16, 17, 21, 21, 80, + 80, 80, 80, 22, 32, 24, 20, 26, 320, 100, + 44, 274, 430, 319, 23, 171, 436, 280, 3, 38, + 39, 15, 329, 383, 351, -1, -1, 447, -1, -1, + 293, 294, 452, -1, -1, -1, 456, 457, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 68, + 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 326, -1, 328, -1, -1, 87, 332, + 89, 90, 91, 92, -1, 94, -1, 340, 341, 342, + -1, -1, -1, -1, 103, -1, -1, 106, -1, 108, + -1, -1, 111, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 368, 369, -1, -1, -1, + -1, -1, -1, 376, -1, -1, -1, -1, -1, 5, + 6, 384, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, -1, 24, -1, + -1, -1, -1, -1, -1, 408, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, + -1, -1, 3, 4, 5, 6, 7, -1, -1, -1, + -1, -1, -1, 436, -1, -1, -1, -1, -1, -1, + -1, 22, -1, 24, 447, 26, 27, 28, -1, 452, + -1, -1, -1, 456, 457, -1, -1, 38, 39, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 100, -1, -1, 103, -1, -1, + 106, -1, 108, 109, -1, -1, -1, 68, 69, 70, + 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, -1, -1, 3, 4, -1, 87, 7, 89, 90, + 91, 92, -1, 94, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 106, 26, 27, 28, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 38, 39, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 68, 69, + 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, -1, -1, -1, -1, -1, 87, -1, 89, + 90, 91, 92, -1, 94, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 5, 6, 106, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, -1, 24, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 37, -1, -1, -1, + -1, -1, 5, 6, 45, 8, 9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + -1, 24, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 37, -1, -1, -1, -1, -1, + -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 100, + -1, -1, 103, -1, -1, 106, -1, 108, 5, 6, + -1, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, -1, 24, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 100, -1, -1, + 103, -1, -1, 106, -1, 108, 5, 6, 45, 8, + 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 22, -1, 24, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 37, -1, + -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 100, -1, -1, 103, -1, 105, 106, + -1, 108, -1, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, -1, 24, -1, -1, -1, -1, -1, -1, -1, + -1, 100, -1, -1, 103, 37, -1, 106, -1, 108, + -1, 5, 6, 45, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 20, 21, 22, -1, + 24, -1, -1, 5, 6, -1, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, + 22, 45, 24, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 100, -1, + -1, 103, -1, 45, 106, -1, 108, 5, 6, -1, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 100, -1, -1, 103, + -1, -1, 106, -1, 108, -1, -1, 45, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 100, -1, + -1, 103, -1, -1, 106, -1, 108, 5, 6, -1, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 22, -1, 24, -1, -1, -1, + 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 46, 100, -1, -1, 103, -1, 45, 106, -1, + 108, 56, 57, -1, -1, -1, -1, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + -1, -1, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 100, -1, -1, 103, -1, -1, 106, -1, + 108 +}; -/* As a special exception, when this file is copied by Bison into a - Bison output file, you may use that output file without restriction. - This special exception was added by the Free Software Foundation - in version 1.24 of Bison. */ +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 143, 144, 145, 0, 25, 31, 41, 42, 43, + 44, 124, 159, 161, 162, 168, 22, 24, 48, 55, + 123, 152, 162, 163, 58, 59, 60, 61, 125, 157, + 23, 169, 170, 30, 109, 160, 169, 49, 50, 51, + 149, 98, 20, 47, 124, 98, 157, 4, 5, 6, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, + 18, 19, 20, 21, 45, 100, 103, 106, 108, 113, + 132, 133, 134, 135, 136, 152, 165, 29, 108, 158, + 123, 173, 98, 98, 98, 103, 150, 132, 32, 33, + 142, 142, 4, 4, 4, 8, 109, 136, 137, 152, + 101, 110, 35, 46, 56, 57, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, + 76, 77, 78, 79, 80, 81, 82, 83, 84, 87, + 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, + 115, 116, 117, 118, 171, 177, 178, 180, 181, 24, + 52, 53, 148, 4, 24, 151, 134, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, 119, 120, + 122, 134, 139, 104, 104, 99, 109, 101, 37, 137, + 138, 134, 167, 56, 8, 167, 9, 21, 10, 11, + 12, 13, 14, 15, 16, 17, 119, 120, 121, 125, + 134, 134, 167, 134, 134, 174, 167, 167, 167, 167, + 167, 167, 167, 134, 134, 134, 167, 125, 85, 86, + 99, 105, 147, 27, 28, 3, 4, 114, 4, 7, + 26, 38, 39, 87, 89, 90, 94, 103, 106, 108, + 111, 115, 116, 117, 118, 140, 165, 146, 136, 136, + 136, 37, 134, 154, 155, 156, 99, 102, 3, 4, + 7, 26, 27, 28, 38, 39, 106, 140, 164, 165, + 166, 166, 166, 166, 132, 99, 127, 99, 127, 166, + 103, 99, 36, 99, 99, 99, 99, 99, 99, 166, + 166, 166, 99, 132, 134, 167, 24, 99, 130, 101, + 101, 101, 101, 105, 139, 141, 141, 109, 141, 24, + 101, 101, 101, 101, 130, 105, 107, 152, 153, 99, + 102, 37, 141, 99, 99, 166, 15, 54, 15, 99, + 179, 166, 103, 134, 167, 134, 167, 167, 134, 134, + 99, 99, 99, 167, 166, 166, 99, 34, 54, 128, + 131, 139, 139, 139, 139, 99, 105, 107, 109, 139, + 139, 139, 139, 37, 154, 128, 129, 107, 21, 21, + 101, 166, 4, 166, 167, 175, 99, 166, 99, 99, + 166, 166, 166, 101, 134, 24, 4, 130, 179, 36, + 99, 99, 139, 99, 99, 99, 99, 54, 126, 166, + 166, 175, 176, 99, 127, 127, 99, 166, 99, 167, + 167, 176, 166, 102, 134, 139, 139, 139, 139, 139, + 139, 4, 99, 103, 102, 167, 105, 166, 102, 102, + 99, 102, 102, 102, 102, 102, 21, 105, 121, 172, + 36, 105, 139, 166, 164, 105, 121, 21, 102, 99, + 164, 166, 21, 99, 66, 166, 21, 21, 166, 166 +}; -/* This is the parser code that is written into each bison parser - when the %semantic_parser declaration is not specified in the grammar. - It was written by Richard Stallman by simplifying the hairy parser - used when %semantic_parser is specified. */ - -#ifndef YYSTACK_USE_ALLOCA -#ifdef alloca -#define YYSTACK_USE_ALLOCA -#else /* alloca not defined */ -#ifdef __GNUC__ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#else /* not GNU C. */ -#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) -#define YYSTACK_USE_ALLOCA -#include -#else /* not sparc */ -/* We think this test detects Watcom and Microsoft C. */ -/* This used to test MSDOS, but that is a bad idea - since that symbol is in the user namespace. */ -#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) -#if 0 /* No need for malloc.h, which pollutes the namespace; - instead, just don't use alloca. */ -#include +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ #endif -#else /* not MSDOS, or __TURBOC__ */ -#if defined(_AIX) -/* I don't know what this was needed for, but it pollutes the namespace. - So I turned it off. rms, 2 May 1997. */ -/* #include */ - #pragma alloca -#define YYSTACK_USE_ALLOCA -#else /* not MSDOS, or __TURBOC__, or _AIX */ -#if 0 -#ifdef __hpux /* haible at ilog.fr says this works for HPUX 9.05 and up, - and on HPUX 10. Eventually we can turn this on. */ -#define YYSTACK_USE_ALLOCA -#define alloca __builtin_alloca -#endif /* __hpux */ +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t #endif -#endif /* not _AIX */ -#endif /* not MSDOS, or __TURBOC__ */ -#endif /* not sparc */ -#endif /* not GNU C */ -#endif /* alloca not defined */ -#endif /* YYSTACK_USE_ALLOCA not defined */ - -#ifdef YYSTACK_USE_ALLOCA -#define YYSTACK_ALLOC alloca -#else -#define YYSTACK_ALLOC malloc +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int #endif - -/* Note: there must be only one dollar sign in this file. - It is replaced by the list of actions, each action - as one case of the switch. */ #define yyerrok (yyerrstatus = 0) #define yyclearin (yychar = YYEMPTY) -#define YYEMPTY -2 +#define YYEMPTY (-2) #define YYEOF 0 + #define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrlab1 -/* Like YYERROR except do call yyerror. - This remains here temporarily to ease the - transition to the new meaning of YYERROR, for GCC. +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. Once GCC version 2 has supplanted version 1, this can go. */ + #define YYFAIL goto yyerrlab + #define YYRECOVERING() (!!yyerrstatus) -#define YYBACKUP(token, value) \ + +#define YYBACKUP(Token, Value) \ do \ if (yychar == YYEMPTY && yylen == 1) \ - { yychar = (token), yylval = (value); \ - yychar1 = YYTRANSLATE (yychar); \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ YYPOPSTACK; \ goto yybackup; \ } \ else \ - { yyerror ("syntax error: cannot back up"); YYERROR; } \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ while (0) #define YYTERROR 1 #define YYERRCODE 256 -#ifndef YYPURE -#define YYLEX yylex() -#endif +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ -#ifdef YYPURE -#ifdef YYLSP_NEEDED -#ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, &yylloc, YYLEX_PARAM) -#else -#define YYLEX yylex(&yylval, &yylloc) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) #endif -#else /* not YYLSP_NEEDED */ + +/* YYLEX -- calling `yylex' with the right arguments. */ + #ifdef YYLEX_PARAM -#define YYLEX yylex(&yylval, YYLEX_PARAM) +# define YYLEX yylex (YYLEX_PARAM) #else -#define YYLEX yylex(&yylval) -#endif -#endif /* not YYLSP_NEEDED */ +# define YYLEX yylex () #endif -/* If nonreentrant, generate the variables here */ +/* Enable debugging if requested. */ +#if YYDEBUG -#ifndef YYPURE +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) -int yychar; /* the lookahead symbol */ -YYSTYPE yylval; /* the semantic value of the */ - /* lookahead symbol */ +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ -#ifdef YYLSP_NEEDED -YYLTYPE yylloc; /* location data for the lookahead */ - /* symbol */ +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short *bottom, short *top) +#else +static void +yy_stack_print (bottom, top) + short *bottom; + short *top; #endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) -int yynerrs; /* number of parse errors so far */ -#endif /* not YYPURE */ -#if YYDEBUG != 0 -int yydebug; /* nonzero means print parse trace */ -/* Since this is uninitialized, it does not stop multiple parsers - from coexisting. */ +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; #endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} -/* YYINITDEPTH indicates the initial size of the parser's stacks */ +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ #ifndef YYINITDEPTH -#define YYINITDEPTH 200 +# define YYINITDEPTH 200 #endif -/* YYMAXDEPTH is the maximum size the stacks can grow to - (effective only if the built-in stack extension method is used). */ +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ -#if YYMAXDEPTH == 0 -#undef YYMAXDEPTH +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH #endif #ifndef YYMAXDEPTH -#define YYMAXDEPTH 10000 +# define YYMAXDEPTH 10000 #endif + -/* Define __yy_memcpy. Note that the size argument - should be passed with type unsigned int, because that is what the non-GCC - definitions require. With GCC, __builtin_memcpy takes an arg - of type size_t, but it can handle unsigned int. */ - -#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ -#define __yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) -#else /* not GNU C or C++ */ -#ifndef __cplusplus -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ -static void -__yy_memcpy (to, from, count) - char *to; - char *from; - unsigned int count; +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif { - register char *f = from; - register char *t = to; - register int i = count; + register char *yyd = yydest; + register const char *yys = yysrc; - while (i-- > 0) - *t++ = *f++; + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; } +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ -#else /* __cplusplus */ + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ -/* This is the most reliable way to avoid incompatibilities - in available built-in functions on various systems. */ +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep) +#else static void -__yy_memcpy (char *to, char *from, unsigned int count) +yysymprint (yyoutput, yytype, yyvaluep) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; +#endif { - register char *t = to; - register char *f = from; - register int i = count; + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - while (i-- > 0) - *t++ = *f++; + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); } +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep) +#else +static void +yydestruct (yytype, yyvaluep) + int yytype; + YYSTYPE *yyvaluep; #endif -#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + + switch (yytype) + { + + default: + break; + } +} -#line 217 "/usr/share/bison.simple" -/* The user can define YYPARSE_PARAM as the name of an argument to be passed - into yyparse. The argument should have type void *. - It should actually point to an object. - Grammar actions can access the variable by casting it - to the proper pointer type. */ +/* Prevent warnings from -Wmissing-prototypes. */ #ifdef YYPARSE_PARAM -#ifdef __cplusplus -#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM -#define YYPARSE_PARAM_DECL -#else /* not __cplusplus */ -#define YYPARSE_PARAM_ARG YYPARSE_PARAM -#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; -#endif /* not __cplusplus */ -#else /* not YYPARSE_PARAM */ -#define YYPARSE_PARAM_ARG -#define YYPARSE_PARAM_DECL -#endif /* not YYPARSE_PARAM */ +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; + + + +/*----------. +| yyparse. | +`----------*/ -/* Prevent warning if -Wstrict-prototypes. */ -#ifdef __GNUC__ #ifdef YYPARSE_PARAM -int yyparse (void *); +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) #else -int yyparse (void); +int +yyparse () + #endif #endif - -int -yyparse(YYPARSE_PARAM_ARG) - YYPARSE_PARAM_DECL { + register int yystate; register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short yyssa[YYINITDEPTH]; + short *yyss = yyssa; register short *yyssp; - register YYSTYPE *yyvsp; - int yyerrstatus; /* number of tokens to shift before error messages enabled */ - int yychar1 = 0; /* lookahead token as an internal (translated) token number */ - short yyssa[YYINITDEPTH]; /* the state stack */ - YYSTYPE yyvsa[YYINITDEPTH]; /* the semantic value stack */ + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; - short *yyss = yyssa; /* refer to the stacks thru separate pointers */ - YYSTYPE *yyvs = yyvsa; /* to allow yyoverflow to reallocate them elsewhere */ -#ifdef YYLSP_NEEDED - YYLTYPE yylsa[YYINITDEPTH]; /* the location stack */ - YYLTYPE *yyls = yylsa; - YYLTYPE *yylsp; -#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) -#else #define YYPOPSTACK (yyvsp--, yyssp--) -#endif - int yystacksize = YYINITDEPTH; - int yyfree_stacks = 0; + YYSIZE_T yystacksize = YYINITDEPTH; -#ifdef YYPURE - int yychar; - YYSTYPE yylval; - int yynerrs; -#ifdef YYLSP_NEEDED - YYLTYPE yylloc; -#endif -#endif + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; - YYSTYPE yyval; /* the variable used to return */ - /* semantic values from the action */ - /* routines */ + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ int yylen; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Starting parse\n"); -#endif + YYDPRINTF ((stderr, "Starting parse\n")); yystate = 0; yyerrstatus = 0; @@ -1955,110 +2467,96 @@ so that they stay on the same level as the state stack. The wasted elements are never initialized. */ - yyssp = yyss - 1; + yyssp = yyss; yyvsp = yyvs; -#ifdef YYLSP_NEEDED - yylsp = yyls; -#endif -/* Push a new state, which is found in yystate . */ -/* In all cases, when you get here, the value and location stacks - have just been pushed. so pushing a state here evens the stacks. */ -yynewstate: - - *++yyssp = yystate; - - if (yyssp >= yyss + yystacksize - 1) - { - /* Give user a chance to reallocate the stack */ - /* Use copies of these so that the &'s don't force the real ones into memory. */ - YYSTYPE *yyvs1 = yyvs; - short *yyss1 = yyss; -#ifdef YYLSP_NEEDED - YYLTYPE *yyls1 = yyls; -#endif + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + if (yyss + yystacksize - 1 <= yyssp) + { /* Get the current used size of the three stacks, in elements. */ - int size = yyssp - yyss + 1; + YYSIZE_T yysize = yyssp - yyss + 1; #ifdef yyoverflow - /* Each stack pointer address is followed by the size of - the data in use in that stack, in bytes. */ -#ifdef YYLSP_NEEDED - /* This used to be a conditional around just the two extra args, - but that might be undefined if yyoverflow is a macro. */ - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yyls1, size * sizeof (*yylsp), - &yystacksize); -#else - yyoverflow("parser stack overflow", - &yyss1, size * sizeof (*yyssp), - &yyvs1, size * sizeof (*yyvsp), - &yystacksize); -#endif + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short *yyss1 = yyss; + + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), - yyss = yyss1; yyvs = yyvs1; -#ifdef YYLSP_NEEDED - yyls = yyls1; -#endif + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } #else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else /* Extend the stack our own way. */ - if (yystacksize >= YYMAXDEPTH) - { - yyerror("parser stack overflow"); - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 2; - } + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; yystacksize *= 2; - if (yystacksize > YYMAXDEPTH) + if (YYMAXDEPTH < yystacksize) yystacksize = YYMAXDEPTH; -#ifndef YYSTACK_USE_ALLOCA - yyfree_stacks = 1; -#endif - yyss = (short *) YYSTACK_ALLOC (yystacksize * sizeof (*yyssp)); - __yy_memcpy ((char *)yyss, (char *)yyss1, - size * (unsigned int) sizeof (*yyssp)); - yyvs = (YYSTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yyvsp)); - __yy_memcpy ((char *)yyvs, (char *)yyvs1, - size * (unsigned int) sizeof (*yyvsp)); -#ifdef YYLSP_NEEDED - yyls = (YYLTYPE *) YYSTACK_ALLOC (yystacksize * sizeof (*yylsp)); - __yy_memcpy ((char *)yyls, (char *)yyls1, - size * (unsigned int) sizeof (*yylsp)); -#endif + + { + short *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif #endif /* no yyoverflow */ - yyssp = yyss + size - 1; - yyvsp = yyvs + size - 1; -#ifdef YYLSP_NEEDED - yylsp = yyls + size - 1; -#endif + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Stack size increased to %d\n", yystacksize); -#endif - if (yyssp >= yyss + yystacksize - 1) + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) YYABORT; } -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Entering state %d\n", yystate); -#endif + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); goto yybackup; - yybackup: + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: /* Do appropriate processing given the current state. */ /* Read a lookahead token if we need one and don't already have one. */ @@ -2067,315 +2565,311 @@ /* First try to decide what to do without reference to lookahead token. */ yyn = yypact[yystate]; - if (yyn == YYFLAG) + if (yyn == YYPACT_NINF) goto yydefault; /* Not known => get a lookahead token if don't already have one. */ - /* yychar is either YYEMPTY or YYEOF - or a valid token in external form. */ - + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ if (yychar == YYEMPTY) { -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Reading a token: "); -#endif + YYDPRINTF ((stderr, "Reading a token: ")); yychar = YYLEX; } - /* Convert token to internal form (in yychar1) for indexing tables with */ - - if (yychar <= 0) /* This means end of input. */ + if (yychar <= YYEOF) { - yychar1 = 0; - yychar = YYEOF; /* Don't call YYLEX any more */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Now at end of input.\n"); -#endif + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); } else { - yychar1 = YYTRANSLATE(yychar); - -#if YYDEBUG != 0 - if (yydebug) - { - fprintf (stderr, "Next token is %d (%s", yychar, yytname[yychar1]); - /* Give the individual parser a way to print the precise meaning - of a token, for further debugging info. */ -#ifdef YYPRINT - YYPRINT (stderr, yychar, yylval); -#endif - fprintf (stderr, ")\n"); - } -#endif + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); } - yyn += yychar1; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1) + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) goto yydefault; - yyn = yytable[yyn]; - - /* yyn is what to do for this token type in this state. - Negative => reduce, -yyn is rule number. - Positive => shift, yyn is new state. - New state is final state => don't bother to shift, - just return success. - 0, or most negative number => error. */ - - if (yyn < 0) + if (yyn <= 0) { - if (yyn == YYFLAG) + if (yyn == 0 || yyn == YYTABLE_NINF) goto yyerrlab; yyn = -yyn; goto yyreduce; } - else if (yyn == 0) - goto yyerrlab; if (yyn == YYFINAL) YYACCEPT; /* Shift the lookahead token. */ - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]); -#endif + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); /* Discard the token being shifted unless it is eof. */ if (yychar != YYEOF) yychar = YYEMPTY; *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif - /* count tokens shifted since error; after three, turn off error status. */ - if (yyerrstatus) yyerrstatus--; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; yystate = yyn; goto yynewstate; -/* Do the default action for the current state. */ -yydefault: +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: yyn = yydefact[yystate]; if (yyn == 0) goto yyerrlab; + goto yyreduce; -/* Do a reduction. yyn is the number of a rule to reduce with. */ + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ yyreduce: + /* yyn is the number of a rule to reduce with. */ yylen = yyr2[yyn]; - if (yylen > 0) - yyval = yyvsp[1-yylen]; /* implement default value of the action */ - -#if YYDEBUG != 0 - if (yydebug) - { - int i; - - fprintf (stderr, "Reducing via rule %d (line %d), ", - yyn, yyrline[yyn]); - /* Print the symbols being reduced, and their result. */ - for (i = yyprhs[yyn]; yyrhs[i] > 0; i++) - fprintf (stderr, "%s ", yytname[yyrhs[i]]); - fprintf (stderr, " -> %s\n", yytname[yyr1[yyn]]); - } -#endif + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; - switch (yyn) { -case 2: -#line 998 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: +#line 998 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UIntVal > (uint32_t)INT32_MAX) // Outside of my range! ThrowException("Value too large for type!"); yyval.SIntVal = (int32_t)yyvsp[0].UIntVal; -; - break;} -case 4: -#line 1006 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 5: +#line 1006 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UInt64Val > (uint64_t)INT64_MAX) // Outside of my range! ThrowException("Value too large for type!"); yyval.SInt64Val = (int64_t)yyvsp[0].UInt64Val; -; - break;} -case 33: -#line 1029 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 34: +#line 1029 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = yyvsp[-1].StrVal; - ; - break;} -case 34: -#line 1032 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 35: +#line 1032 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; - ; - break;} -case 35: -#line 1036 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::InternalLinkage; ; - break;} -case 36: -#line 1037 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::LinkOnceLinkage; ; - break;} -case 37: -#line 1038 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::WeakLinkage; ; - break;} -case 38: -#line 1039 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::AppendingLinkage; ; - break;} -case 39: -#line 1040 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Linkage = GlobalValue::ExternalLinkage; ; - break;} -case 40: -#line 1042 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 41: -#line 1043 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::C; ; - break;} -case 42: -#line 1044 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Fast; ; - break;} -case 43: -#line 1045 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = CallingConv::Cold; ; - break;} -case 44: -#line 1046 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) - ThrowException("Calling conv too large!"); - yyval.UIntVal = yyvsp[0].UInt64Val; - ; - break;} -case 45: -#line 1054 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 46: -#line 1055 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) - ThrowException("Alignment must be a power of two!"); -; - break;} -case 47: -#line 1060 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.UIntVal = 0; ; - break;} -case 48: -#line 1061 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - yyval.UIntVal = yyvsp[0].UInt64Val; - if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) - ThrowException("Alignment must be a power of two!"); -; - break;} -case 49: -#line 1068 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) - if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') - ThrowException("Invalid character in section name!"); - yyval.StrVal = yyvsp[0].StrVal; -; - break;} -case 50: -#line 1075 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 51: -#line 1076 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = yyvsp[0].StrVal; ; - break;} -case 52: -#line 1081 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 53: -#line 1082 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{; - break;} -case 54: -#line 1083 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - CurGV->setSection(yyvsp[0].StrVal); + ;} + break; + + case 36: +#line 1036 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::InternalLinkage; ;} + break; + + case 37: +#line 1037 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::LinkOnceLinkage; ;} + break; + + case 38: +#line 1038 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::WeakLinkage; ;} + break; + + case 39: +#line 1039 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::AppendingLinkage; ;} + break; + + case 40: +#line 1040 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Linkage = GlobalValue::ExternalLinkage; ;} + break; + + case 41: +#line 1042 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::C; ;} + break; + + case 42: +#line 1043 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::C; ;} + break; + + case 43: +#line 1044 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::Fast; ;} + break; + + case 44: +#line 1045 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = CallingConv::Cold; ;} + break; + + case 45: +#line 1046 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + if ((unsigned)yyvsp[0].UInt64Val != yyvsp[0].UInt64Val) + ThrowException("Calling conv too large!"); + yyval.UIntVal = yyvsp[0].UInt64Val; + ;} + break; + + case 46: +#line 1054 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = 0; ;} + break; + + case 47: +#line 1055 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + yyval.UIntVal = yyvsp[0].UInt64Val; + if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + ThrowException("Alignment must be a power of two!"); +;} + break; + + case 48: +#line 1060 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.UIntVal = 0; ;} + break; + + case 49: +#line 1061 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + yyval.UIntVal = yyvsp[0].UInt64Val; + if (yyval.UIntVal != 0 && !isPowerOf2_32(yyval.UIntVal)) + ThrowException("Alignment must be a power of two!"); +;} + break; + + case 50: +#line 1068 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + for (unsigned i = 0, e = strlen(yyvsp[0].StrVal); i != e; ++i) + if (yyvsp[0].StrVal[i] == '"' || yyvsp[0].StrVal[i] == '\\') + ThrowException("Invalid character in section name!"); + yyval.StrVal = yyvsp[0].StrVal; +;} + break; + + case 51: +#line 1075 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; ;} + break; + + case 52: +#line 1076 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = yyvsp[0].StrVal; ;} + break; + + case 53: +#line 1081 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 54: +#line 1082 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + {;} + break; + + case 55: +#line 1083 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + CurGV->setSection(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 55: -#line 1087 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 56: +#line 1087 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UInt64Val != 0 && !isPowerOf2_32(yyvsp[0].UInt64Val)) ThrowException("Alignment must be a power of two!"); CurGV->setAlignment(yyvsp[0].UInt64Val); - ; - break;} -case 57: -#line 1100 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; - break;} -case 59: -#line 1101 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ; - break;} -case 60: -#line 1103 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 58: +#line 1100 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + break; + + case 60: +#line 1101 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); ;} + break; + + case 61: +#line 1103 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!UpRefs.empty()) ThrowException("Invalid upreference in type: " + (*yyvsp[0].TypeVal)->getDescription()); yyval.TypeVal = yyvsp[0].TypeVal; - ; - break;} -case 74: -#line 1114 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 75: +#line 1114 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(OpaqueType::get()); - ; - break;} -case 75: -#line 1117 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 76: +#line 1117 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeVal = new PATypeHolder(yyvsp[0].PrimType); - ; - break;} -case 76: -#line 1120 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Named types are also simple types... + ;} + break; + + case 77: +#line 1120 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Named types are also simple types... yyval.TypeVal = new PATypeHolder(getTypeVal(yyvsp[0].ValIDVal)); -; - break;} -case 77: -#line 1126 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Type UpReference +;} + break; + + case 78: +#line 1126 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Type UpReference if (yyvsp[0].UInt64Val > (uint64_t)~0U) ThrowException("Value out of range!"); OpaqueType *OT = OpaqueType::get(); // Use temporary placeholder UpRefs.push_back(UpRefRecord((unsigned)yyvsp[0].UInt64Val, OT)); // Add to vector... yyval.TypeVal = new PATypeHolder(OT); UR_OUT("New Upreference!\n"); - ; - break;} -case 78: -#line 1133 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Function derived type? + ;} + break; + + case 79: +#line 1133 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Function derived type? std::vector Params; for (std::list::iterator I = yyvsp[-1].TypeList->begin(), E = yyvsp[-1].TypeList->end(); I != E; ++I) @@ -2386,18 +2880,20 @@ yyval.TypeVal = new PATypeHolder(HandleUpRefs(FunctionType::get(*yyvsp[-3].TypeVal,Params,isVarArg))); delete yyvsp[-1].TypeList; // Delete the argument list delete yyvsp[-3].TypeVal; // Delete the return type handle - ; - break;} -case 79: -#line 1145 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Sized array type? + ;} + break; + + case 80: +#line 1145 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Sized array type? yyval.TypeVal = new PATypeHolder(HandleUpRefs(ArrayType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); delete yyvsp[-1].TypeVal; - ; - break;} -case 80: -#line 1149 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Packed array type? + ;} + break; + + case 81: +#line 1149 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Packed array type? const llvm::Type* ElemTy = yyvsp[-1].TypeVal->get(); if ((unsigned)yyvsp[-3].UInt64Val != yyvsp[-3].UInt64Val) ThrowException("Unsigned result not equal to signed result"); @@ -2407,11 +2903,12 @@ ThrowException("Vector length should be a power of 2!"); yyval.TypeVal = new PATypeHolder(HandleUpRefs(PackedType::get(*yyvsp[-1].TypeVal, (unsigned)yyvsp[-3].UInt64Val))); delete yyvsp[-1].TypeVal; - ; - break;} -case 81: -#line 1160 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Structure type? + ;} + break; + + case 82: +#line 1160 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Structure type? std::vector Elements; for (std::list::iterator I = yyvsp[-1].TypeList->begin(), E = yyvsp[-1].TypeList->end(); I != E; ++I) @@ -2419,55 +2916,63 @@ yyval.TypeVal = new PATypeHolder(HandleUpRefs(StructType::get(Elements))); delete yyvsp[-1].TypeList; - ; - break;} -case 82: -#line 1169 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Empty structure type? + ;} + break; + + case 83: +#line 1169 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Empty structure type? yyval.TypeVal = new PATypeHolder(StructType::get(std::vector())); - ; - break;} -case 83: -#line 1172 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Pointer type? + ;} + break; + + case 84: +#line 1172 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Pointer type? yyval.TypeVal = new PATypeHolder(HandleUpRefs(PointerType::get(*yyvsp[-1].TypeVal))); delete yyvsp[-1].TypeVal; - ; - break;} -case 84: -#line 1180 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 85: +#line 1180 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeList = new std::list(); yyval.TypeList->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 85: -#line 1184 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 86: +#line 1184 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeList=yyvsp[-2].TypeList)->push_back(*yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 87: -#line 1190 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 88: +#line 1190 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeList=yyvsp[-2].TypeList)->push_back(Type::VoidTy); - ; - break;} -case 88: -#line 1193 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 89: +#line 1193 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.TypeList = new std::list())->push_back(Type::VoidTy); - ; - break;} -case 89: -#line 1196 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 90: +#line 1196 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TypeList = new std::list(); - ; - break;} -case 90: -#line 1206 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr + ;} + break; + + case 91: +#line 1206 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr const ArrayType *ATy = dyn_cast(yyvsp[-3].TypeVal->get()); if (ATy == 0) ThrowException("Cannot make array constant with type: '" + @@ -2491,11 +2996,12 @@ yyval.ConstVal = ConstantArray::get(ATy, *yyvsp[-1].ConstVector); delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; - ; - break;} -case 91: -#line 1231 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 92: +#line 1231 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) ThrowException("Cannot make array constant with type: '" + @@ -2507,11 +3013,12 @@ " arguments, but has size of " + itostr(NumElements) +"!"); yyval.ConstVal = ConstantArray::get(ATy, std::vector()); delete yyvsp[-2].TypeVal; - ; - break;} -case 92: -#line 1244 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 93: +#line 1244 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const ArrayType *ATy = dyn_cast(yyvsp[-2].TypeVal->get()); if (ATy == 0) ThrowException("Cannot make array constant with type: '" + @@ -2538,11 +3045,12 @@ free(yyvsp[0].StrVal); yyval.ConstVal = ConstantArray::get(ATy, Vals); delete yyvsp[-2].TypeVal; - ; - break;} -case 93: -#line 1272 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized arr + ;} + break; + + case 94: +#line 1272 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized arr const PackedType *PTy = dyn_cast(yyvsp[-3].TypeVal->get()); if (PTy == 0) ThrowException("Cannot make packed constant with type: '" + @@ -2566,11 +3074,12 @@ yyval.ConstVal = ConstantPacked::get(PTy, *yyvsp[-1].ConstVector); delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; - ; - break;} -case 94: -#line 1297 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 95: +#line 1297 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const StructType *STy = dyn_cast(yyvsp[-3].TypeVal->get()); if (STy == 0) ThrowException("Cannot make struct constant with type: '" + @@ -2589,11 +3098,12 @@ yyval.ConstVal = ConstantStruct::get(STy, *yyvsp[-1].ConstVector); delete yyvsp[-3].TypeVal; delete yyvsp[-1].ConstVector; - ; - break;} -case 95: -#line 1317 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 96: +#line 1317 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const StructType *STy = dyn_cast(yyvsp[-2].TypeVal->get()); if (STy == 0) ThrowException("Cannot make struct constant with type: '" + @@ -2604,11 +3114,12 @@ yyval.ConstVal = ConstantStruct::get(STy, std::vector()); delete yyvsp[-2].TypeVal; - ; - break;} -case 96: -#line 1329 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 97: +#line 1329 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PTy = dyn_cast(yyvsp[-1].TypeVal->get()); if (PTy == 0) ThrowException("Cannot make null pointer constant with type: '" + @@ -2616,18 +3127,20 @@ yyval.ConstVal = ConstantPointerNull::get(PTy); delete yyvsp[-1].TypeVal; - ; - break;} -case 97: -#line 1338 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 98: +#line 1338 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ConstVal = UndefValue::get(yyvsp[-1].TypeVal->get()); delete yyvsp[-1].TypeVal; - ; - break;} -case 98: -#line 1342 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 99: +#line 1342 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *Ty = dyn_cast(yyvsp[-1].TypeVal->get()); if (Ty == 0) ThrowException("Global const reference must be a pointer type!"); @@ -2685,66 +3198,74 @@ yyval.ConstVal = cast(V); delete yyvsp[-1].TypeVal; // Free the type handle - ; - break;} -case 99: -#line 1401 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 100: +#line 1401 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-1].TypeVal->get() != yyvsp[0].ConstVal->getType()) ThrowException("Mismatched types for constant expression!"); yyval.ConstVal = yyvsp[0].ConstVal; delete yyvsp[-1].TypeVal; - ; - break;} -case 100: -#line 1407 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 101: +#line 1407 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const Type *Ty = yyvsp[-1].TypeVal->get(); if (isa(Ty) || Ty == Type::LabelTy || isa(Ty)) ThrowException("Cannot create a null initialized value of this type!"); yyval.ConstVal = Constant::getNullValue(Ty); delete yyvsp[-1].TypeVal; - ; - break;} -case 101: -#line 1415 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // integral constants + ;} + break; + + case 102: +#line 1415 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // integral constants if (!ConstantSInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].SInt64Val)) ThrowException("Constant value doesn't fit in type!"); yyval.ConstVal = ConstantSInt::get(yyvsp[-1].PrimType, yyvsp[0].SInt64Val); - ; - break;} -case 102: -#line 1420 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // integral constants + ;} + break; + + case 103: +#line 1420 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // integral constants if (!ConstantUInt::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].UInt64Val)) ThrowException("Constant value doesn't fit in type!"); yyval.ConstVal = ConstantUInt::get(yyvsp[-1].PrimType, yyvsp[0].UInt64Val); - ; - break;} -case 103: -#line 1425 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants + ;} + break; + + case 104: +#line 1425 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants yyval.ConstVal = ConstantBool::True; - ; - break;} -case 104: -#line 1428 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Boolean constants + ;} + break; + + case 105: +#line 1428 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Boolean constants yyval.ConstVal = ConstantBool::False; - ; - break;} -case 105: -#line 1431 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Float & Double constants + ;} + break; + + case 106: +#line 1431 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Float & Double constants if (!ConstantFP::isValueValidForType(yyvsp[-1].PrimType, yyvsp[0].FPVal)) ThrowException("Floating point constant invalid for type!!"); yyval.ConstVal = ConstantFP::get(yyvsp[-1].PrimType, yyvsp[0].FPVal); - ; - break;} -case 106: -#line 1438 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 107: +#line 1438 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!yyvsp[-3].ConstVal->getType()->isFirstClassType()) ThrowException("cast constant expression from a non-primitive type: '" + yyvsp[-3].ConstVal->getType()->getDescription() + "'!"); @@ -2753,11 +3274,12 @@ yyvsp[-1].TypeVal->get()->getDescription() + "'!"); yyval.ConstVal = ConstantExpr::getCast(yyvsp[-3].ConstVal, yyvsp[-1].TypeVal->get()); delete yyvsp[-1].TypeVal; - ; - break;} -case 107: -#line 1448 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 108: +#line 1448 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-2].ConstVal->getType())) ThrowException("GetElementPtr requires a pointer operand!"); @@ -2787,21 +3309,23 @@ delete yyvsp[-1].ValueList; yyval.ConstVal = ConstantExpr::getGetElementPtr(yyvsp[-2].ConstVal, IdxVec); - ; - break;} -case 108: -#line 1479 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 109: +#line 1479 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-5].ConstVal->getType() != Type::BoolTy) ThrowException("Select condition must be of boolean type!"); if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Select operand types must match!"); yyval.ConstVal = ConstantExpr::getSelect(yyvsp[-5].ConstVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 109: -#line 1486 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 110: +#line 1486 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Binary operator types must match!"); // HACK: llvm 1.3 and earlier used to emit invalid pointer constant exprs. @@ -2821,11 +3345,12 @@ ConstantExpr::getCast(yyvsp[-1].ConstVal, IntPtrTy)); yyval.ConstVal = ConstantExpr::getCast(yyval.ConstVal, yyvsp[-3].ConstVal->getType()); } - ; - break;} -case 110: -#line 1507 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 111: +#line 1507 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("Logical operator types must match!"); if (!yyvsp[-3].ConstVal->getType()->isIntegral()) { @@ -2834,87 +3359,99 @@ ThrowException("Logical operator requires integral operands!"); } yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 111: -#line 1517 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 112: +#line 1517 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-3].ConstVal->getType() != yyvsp[-1].ConstVal->getType()) ThrowException("setcc operand types must match!"); yyval.ConstVal = ConstantExpr::get(yyvsp[-5].BinaryOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 112: -#line 1522 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 113: +#line 1522 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-1].ConstVal->getType() != Type::UByteTy) ThrowException("Shift count for shift constant must be unsigned byte!"); if (!yyvsp[-3].ConstVal->getType()->isInteger()) ThrowException("Shift constant expression requires integer operand!"); yyval.ConstVal = ConstantExpr::get(yyvsp[-5].OtherOpVal, yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 113: -#line 1529 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 114: +#line 1529 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-3].ConstVal->getType())) ThrowException("First operand of extractelement must be " "packed type!"); if (yyvsp[-1].ConstVal->getType() != Type::UIntTy) ThrowException("Second operand of extractelement must be uint!"); yyval.ConstVal = ConstantExpr::getExtractElement(yyvsp[-3].ConstVal, yyvsp[-1].ConstVal); - ; - break;} -case 114: -#line 1539 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 115: +#line 1539 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { (yyval.ConstVector = yyvsp[-2].ConstVector)->push_back(yyvsp[0].ConstVal); - ; - break;} -case 115: -#line 1542 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 116: +#line 1542 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ConstVector = new std::vector(); yyval.ConstVector->push_back(yyvsp[0].ConstVal); - ; - break;} -case 116: -#line 1549 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = false; ; - break;} -case 117: -#line 1549 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.BoolVal = true; ; - break;} -case 118: -#line 1559 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 117: +#line 1549 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; ;} + break; + + case 118: +#line 1549 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; ;} + break; + + case 119: +#line 1559 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = ParserResult = yyvsp[0].ModuleVal; CurModule.ModuleDone(); -; - break;} -case 119: -#line 1566 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 120: +#line 1566 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = yyvsp[-1].ModuleVal; CurFun.FunctionDone(); - ; - break;} -case 120: -#line 1570 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 121: +#line 1570 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = yyvsp[-1].ModuleVal; - ; - break;} -case 121: -#line 1573 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 122: +#line 1573 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = yyvsp[-1].ModuleVal; - ; - break;} -case 122: -#line 1576 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 123: +#line 1576 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ModuleVal = CurModule.CurrentModule; // Emit an error if there are any unresolved types left. if (!CurModule.LateResolveTypes.empty()) { @@ -2924,11 +3461,12 @@ else ThrowException("Reference to an undefined type: #" + itostr(DID.Num)); } - ; - break;} -case 123: -#line 1589 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 124: +#line 1589 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Eagerly resolve types. This is not an optimization, this is a // requirement that is due to the fact that we could have this: // @@ -2947,164 +3485,189 @@ } delete yyvsp[0].TypeVal; - ; - break;} -case 124: -#line 1609 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Function prototypes can be in const pool - ; - break;} -case 125: -#line 1611 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 125: +#line 1609 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Function prototypes can be in const pool + ;} + break; + + case 126: +#line 1611 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].ConstVal == 0) ThrowException("Global value initializer is not a constant!"); CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, yyvsp[-2].Linkage, yyvsp[-1].BoolVal, yyvsp[0].ConstVal->getType(), yyvsp[0].ConstVal); - ; - break;} -case 126: -#line 1614 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 127: +#line 1614 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 127: -#line 1617 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 128: +#line 1617 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV = ParseGlobalVariable(yyvsp[-3].StrVal, GlobalValue::ExternalLinkage, yyvsp[-1].BoolVal, *yyvsp[0].TypeVal, 0); delete yyvsp[0].TypeVal; - ; - break;} -case 128: -#line 1621 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 129: +#line 1621 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurGV = 0; - ; - break;} -case 129: -#line 1624 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 130: -#line 1626 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 131: -#line 1628 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 132: -#line 1633 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Endianness = Module::BigEndian; ; - break;} -case 133: -#line 1634 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.Endianness = Module::LittleEndian; ; - break;} -case 134: -#line 1636 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 130: +#line 1624 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 131: +#line 1626 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 132: +#line 1628 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 133: +#line 1633 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Endianness = Module::BigEndian; ;} + break; + + case 134: +#line 1634 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.Endianness = Module::LittleEndian; ;} + break; + + case 135: +#line 1636 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->setEndianness(yyvsp[0].Endianness); - ; - break;} -case 135: -#line 1639 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 136: +#line 1639 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].UInt64Val == 32) CurModule.CurrentModule->setPointerSize(Module::Pointer32); else if (yyvsp[0].UInt64Val == 64) CurModule.CurrentModule->setPointerSize(Module::Pointer64); else ThrowException("Invalid pointer size: '" + utostr(yyvsp[0].UInt64Val) + "'!"); - ; - break;} -case 136: -#line 1647 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 137: +#line 1647 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->setTargetTriple(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 138: -#line 1654 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 139: +#line 1654 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 139: -#line 1658 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 140: +#line 1658 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurModule.CurrentModule->addLibrary(yyvsp[0].StrVal); free(yyvsp[0].StrVal); - ; - break;} -case 140: -#line 1662 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ - ; - break;} -case 144: -#line 1671 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.StrVal = 0; ; - break;} -case 145: -#line 1673 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 141: +#line 1662 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { + ;} + break; + + case 145: +#line 1671 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.StrVal = 0; ;} + break; + + case 146: +#line 1673 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (*yyvsp[-1].TypeVal == Type::VoidTy) ThrowException("void typed arguments are invalid!"); yyval.ArgVal = new std::pair(yyvsp[-1].TypeVal, yyvsp[0].StrVal); -; - break;} -case 146: -#line 1679 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 147: +#line 1679 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = yyvsp[-2].ArgList; yyvsp[-2].ArgList->push_back(*yyvsp[0].ArgVal); delete yyvsp[0].ArgVal; - ; - break;} -case 147: -#line 1684 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 148: +#line 1684 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = new std::vector >(); yyval.ArgList->push_back(*yyvsp[0].ArgVal); delete yyvsp[0].ArgVal; - ; - break;} -case 148: -#line 1690 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 149: +#line 1690 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = yyvsp[0].ArgList; - ; - break;} -case 149: -#line 1693 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 150: +#line 1693 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = yyvsp[-2].ArgList; yyval.ArgList->push_back(std::pair(new PATypeHolder(Type::VoidTy), 0)); - ; - break;} -case 150: -#line 1698 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 151: +#line 1698 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = new std::vector >(); yyval.ArgList->push_back(std::make_pair(new PATypeHolder(Type::VoidTy), (char*)0)); - ; - break;} -case 151: -#line 1702 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 152: +#line 1702 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ArgList = 0; - ; - break;} -case 152: -#line 1707 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 153: +#line 1707 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { UnEscapeLexed(yyvsp[-5].StrVal); std::string FunctionName(yyvsp[-5].StrVal); free(yyvsp[-5].StrVal); // Free strdup'd memory! @@ -3187,86 +3750,99 @@ delete yyvsp[-3].ArgList; // We're now done with the argument list } -; - break;} -case 155: -#line 1794 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 156: +#line 1794 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = CurFun.CurrentFunction; // Make sure that we keep track of the linkage type even if there was a // previous "declare". yyval.FunctionVal->setLinkage(yyvsp[-2].Linkage); -; - break;} -case 158: -#line 1804 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 159: +#line 1804 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = yyvsp[-1].FunctionVal; -; - break;} -case 159: -#line 1808 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ CurFun.isDeclare = true; ; - break;} -case 160: -#line 1808 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ +;} + break; + + case 160: +#line 1808 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { CurFun.isDeclare = true; ;} + break; + + case 161: +#line 1808 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = CurFun.CurrentFunction; CurFun.FunctionDone(); -; - break;} -case 161: -#line 1817 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // A reference to a direct constant +;} + break; + + case 162: +#line 1817 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // A reference to a direct constant yyval.ValIDVal = ValID::create(yyvsp[0].SInt64Val); - ; - break;} -case 162: -#line 1820 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 163: +#line 1820 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(yyvsp[0].UInt64Val); - ; - break;} -case 163: -#line 1823 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Perhaps it's an FP constant? + ;} + break; + + case 164: +#line 1823 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Perhaps it's an FP constant? yyval.ValIDVal = ValID::create(yyvsp[0].FPVal); - ; - break;} -case 164: -#line 1826 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 165: +#line 1826 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(ConstantBool::True); - ; - break;} -case 165: -#line 1829 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 166: +#line 1829 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(ConstantBool::False); - ; - break;} -case 166: -#line 1832 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 167: +#line 1832 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::createNull(); - ; - break;} -case 167: -#line 1835 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 168: +#line 1835 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::createUndef(); - ; - break;} -case 168: -#line 1838 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // A vector zero constant. + ;} + break; + + case 169: +#line 1838 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // A vector zero constant. yyval.ValIDVal = ValID::createZeroInit(); - ; - break;} -case 169: -#line 1841 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Nonempty unsized packed vector + ;} + break; + + case 170: +#line 1841 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Nonempty unsized packed vector const Type *ETy = (*yyvsp[-1].ConstVector)[0]->getType(); int NumElements = yyvsp[-1].ConstVector->size(); @@ -3289,65 +3865,74 @@ yyval.ValIDVal = ValID::create(ConstantPacked::get(pt, *yyvsp[-1].ConstVector)); delete PTy; delete yyvsp[-1].ConstVector; - ; - break;} -case 170: -#line 1865 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 171: +#line 1865 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValIDVal = ValID::create(yyvsp[0].ConstVal); - ; - break;} -case 171: -#line 1872 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Is it an integer reference...? + ;} + break; + + case 172: +#line 1872 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Is it an integer reference...? yyval.ValIDVal = ValID::create(yyvsp[0].SIntVal); - ; - break;} -case 172: -#line 1875 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Is it a named reference...? + ;} + break; + + case 173: +#line 1875 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Is it a named reference...? yyval.ValIDVal = ValID::create(yyvsp[0].StrVal); - ; - break;} -case 175: -#line 1886 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 176: +#line 1886 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueVal = getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 176: -#line 1890 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 177: +#line 1890 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.FunctionVal = yyvsp[-1].FunctionVal; - ; - break;} -case 177: -#line 1893 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Do not allow functions with 0 basic blocks + ;} + break; + + case 178: +#line 1893 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Do not allow functions with 0 basic blocks yyval.FunctionVal = yyvsp[-1].FunctionVal; - ; - break;} -case 178: -#line 1901 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 179: +#line 1901 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { setValueName(yyvsp[0].TermInstVal, yyvsp[-1].StrVal); InsertValue(yyvsp[0].TermInstVal); yyvsp[-2].BasicBlockVal->getInstList().push_back(yyvsp[0].TermInstVal); InsertValue(yyvsp[-2].BasicBlockVal); yyval.BasicBlockVal = yyvsp[-2].BasicBlockVal; - ; - break;} -case 179: -#line 1910 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 180: +#line 1910 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyvsp[-1].BasicBlockVal->getInstList().push_back(yyvsp[0].InstVal); yyval.BasicBlockVal = yyvsp[-1].BasicBlockVal; - ; - break;} -case 180: -#line 1914 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 181: +#line 1914 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create((int)CurFun.NextBBNum++), true); // Make sure to move the basic block to the correct location in the @@ -3356,11 +3941,12 @@ Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); - ; - break;} -case 181: -#line 1924 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 182: +#line 1924 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BasicBlockVal = CurBB = getBBVal(ValID::create(yyvsp[0].StrVal), true); // Make sure to move the basic block to the correct location in the @@ -3369,35 +3955,40 @@ Function::BasicBlockListType &BBL = CurFun.CurrentFunction->getBasicBlockList(); BBL.splice(BBL.end(), BBL, yyval.BasicBlockVal); - ; - break;} -case 182: -#line 1935 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Return with a result... + ;} + break; + + case 183: +#line 1935 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Return with a result... yyval.TermInstVal = new ReturnInst(yyvsp[0].ValueVal); - ; - break;} -case 183: -#line 1938 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Return with no result... + ;} + break; + + case 184: +#line 1938 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Return with no result... yyval.TermInstVal = new ReturnInst(); - ; - break;} -case 184: -#line 1941 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Unconditional Branch... + ;} + break; + + case 185: +#line 1941 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Unconditional Branch... yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[0].ValIDVal)); - ; - break;} -case 185: -#line 1944 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 186: +#line 1944 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TermInstVal = new BranchInst(getBBVal(yyvsp[-3].ValIDVal), getBBVal(yyvsp[0].ValIDVal), getVal(Type::BoolTy, yyvsp[-6].ValIDVal)); - ; - break;} -case 186: -#line 1947 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 187: +#line 1947 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { SwitchInst *S = new SwitchInst(getVal(yyvsp[-7].PrimType, yyvsp[-6].ValIDVal), getBBVal(yyvsp[-3].ValIDVal), yyvsp[-1].JumpTable->size()); yyval.TermInstVal = S; @@ -3410,18 +4001,20 @@ ThrowException("Switch case is constant, but not a simple integer!"); } delete yyvsp[-1].JumpTable; - ; - break;} -case 187: -#line 1961 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 188: +#line 1961 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { SwitchInst *S = new SwitchInst(getVal(yyvsp[-6].PrimType, yyvsp[-5].ValIDVal), getBBVal(yyvsp[-2].ValIDVal), 0); yyval.TermInstVal = S; - ; - break;} -case 188: -#line 1966 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 189: +#line 1966 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PFTy; const FunctionType *Ty; @@ -3472,34 +4065,38 @@ delete yyvsp[-10].TypeVal; delete yyvsp[-7].ValueList; - ; - break;} -case 189: -#line 2018 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 190: +#line 2018 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TermInstVal = new UnwindInst(); - ; - break;} -case 190: -#line 2021 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 191: +#line 2021 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.TermInstVal = new UnreachableInst(); - ; - break;} -case 191: -#line 2027 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 192: +#line 2027 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.JumpTable = yyvsp[-5].JumpTable; Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); if (V == 0) ThrowException("May only switch on a constant pool value!"); yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); - ; - break;} -case 192: -#line 2035 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 193: +#line 2035 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.JumpTable = new std::vector >(); Constant *V = cast(getValNonImprovising(yyvsp[-4].PrimType, yyvsp[-3].ValIDVal)); @@ -3507,66 +4104,75 @@ ThrowException("May only switch on a constant pool value!"); yyval.JumpTable->push_back(std::make_pair(V, getBBVal(yyvsp[0].ValIDVal))); - ; - break;} -case 193: -#line 2045 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 194: +#line 2045 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Is this definition named?? if so, assign the name... setValueName(yyvsp[0].InstVal, yyvsp[-1].StrVal); InsertValue(yyvsp[0].InstVal); yyval.InstVal = yyvsp[0].InstVal; -; - break;} -case 194: -#line 2052 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Used for PHI nodes +;} + break; + + case 195: +#line 2052 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Used for PHI nodes yyval.PHIList = new std::list >(); yyval.PHIList->push_back(std::make_pair(getVal(*yyvsp[-5].TypeVal, yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); delete yyvsp[-5].TypeVal; - ; - break;} -case 195: -#line 2057 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 196: +#line 2057 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.PHIList = yyvsp[-6].PHIList; yyvsp[-6].PHIList->push_back(std::make_pair(getVal(yyvsp[-6].PHIList->front().first->getType(), yyvsp[-3].ValIDVal), getBBVal(yyvsp[-1].ValIDVal))); - ; - break;} -case 196: -#line 2064 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ // Used for call statements, and memory insts... + ;} + break; + + case 197: +#line 2064 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { // Used for call statements, and memory insts... yyval.ValueList = new std::vector(); yyval.ValueList->push_back(yyvsp[0].ValueVal); - ; - break;} -case 197: -#line 2068 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 198: +#line 2068 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = yyvsp[-2].ValueList; yyvsp[-2].ValueList->push_back(yyvsp[0].ValueVal); - ; - break;} -case 199: -#line 2074 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ yyval.ValueList = 0; ; - break;} -case 200: -#line 2076 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 200: +#line 2074 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = 0; ;} + break; + + case 201: +#line 2076 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; - ; - break;} -case 201: -#line 2079 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 202: +#line 2079 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; - ; - break;} -case 202: -#line 2085 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 203: +#line 2085 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!(*yyvsp[-3].TypeVal)->isInteger() && !(*yyvsp[-3].TypeVal)->isFloatingPoint() && !isa((*yyvsp[-3].TypeVal).get())) ThrowException( @@ -3577,11 +4183,12 @@ if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); delete yyvsp[-3].TypeVal; - ; - break;} -case 203: -#line 2097 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 204: +#line 2097 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!(*yyvsp[-3].TypeVal)->isIntegral()) { if (!isa(yyvsp[-3].TypeVal->get()) || !cast(yyvsp[-3].TypeVal->get())->getElementType()->isIntegral()) @@ -3591,11 +4198,12 @@ if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); delete yyvsp[-3].TypeVal; - ; - break;} -case 204: -#line 2108 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 205: +#line 2108 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if(isa((*yyvsp[-3].TypeVal).get())) { ThrowException( "PackedTypes currently not supported in setcc instructions!"); @@ -3604,11 +4212,12 @@ if (yyval.InstVal == 0) ThrowException("binary operator returned null!"); delete yyvsp[-3].TypeVal; - ; - break;} -case 205: -#line 2118 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 206: +#line 2118 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { std::cerr << "WARNING: Use of eliminated 'not' instruction:" << " Replacing with 'xor'.\n"; @@ -3619,49 +4228,54 @@ yyval.InstVal = BinaryOperator::create(Instruction::Xor, yyvsp[0].ValueVal, Ones); if (yyval.InstVal == 0) ThrowException("Could not create a xor instruction!"); - ; - break;} -case 206: -#line 2130 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 207: +#line 2130 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[0].ValueVal->getType() != Type::UByteTy) ThrowException("Shift amount must be ubyte!"); if (!yyvsp[-2].ValueVal->getType()->isInteger()) ThrowException("Shift constant expression requires integer operand!"); yyval.InstVal = new ShiftInst(yyvsp[-3].OtherOpVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 207: -#line 2137 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 208: +#line 2137 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!yyvsp[0].TypeVal->get()->isFirstClassType()) ThrowException("cast instruction to a non-primitive type: '" + yyvsp[0].TypeVal->get()->getDescription() + "'!"); yyval.InstVal = new CastInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 208: -#line 2144 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 209: +#line 2144 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (yyvsp[-4].ValueVal->getType() != Type::BoolTy) ThrowException("select condition must be boolean!"); if (yyvsp[-2].ValueVal->getType() != yyvsp[0].ValueVal->getType()) ThrowException("select value types should match!"); yyval.InstVal = new SelectInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 209: -#line 2151 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 210: +#line 2151 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { NewVarArgs = true; yyval.InstVal = new VAArgInst(yyvsp[-2].ValueVal, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 210: -#line 2156 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 211: +#line 2156 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); Function* NF = CurModule.CurrentModule-> @@ -3679,11 +4293,12 @@ CurBB->getInstList().push_back(new StoreInst(bar, foo)); yyval.InstVal = new VAArgInst(foo, *yyvsp[0].TypeVal); delete yyvsp[0].TypeVal; - ; - break;} -case 211: -#line 2175 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 212: +#line 2175 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { ObsoleteVarArgs = true; const Type* ArgTy = yyvsp[-2].ValueVal->getType(); Function* NF = CurModule.CurrentModule-> @@ -3704,22 +4319,24 @@ CurBB->getInstList().push_back(tmp); yyval.InstVal = new LoadInst(foo); delete yyvsp[0].TypeVal; - ; - break;} -case 212: -#line 2197 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 213: +#line 2197 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-2].ValueVal->getType())) ThrowException("First operand of extractelement must be " "packed type!"); if (yyvsp[0].ValueVal->getType() != Type::UIntTy) ThrowException("Second operand of extractelement must be uint!"); yyval.InstVal = new ExtractElementInst(yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 213: -#line 2205 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 214: +#line 2205 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-4].ValueVal->getType())) ThrowException("First operand of insertelement must be " "packed type!"); @@ -3730,11 +4347,12 @@ if (yyvsp[0].ValueVal->getType() != Type::UIntTy) ThrowException("Third operand of insertelement must be uint!"); yyval.InstVal = new InsertElementInst(yyvsp[-4].ValueVal, yyvsp[-2].ValueVal, yyvsp[0].ValueVal); - ; - break;} -case 214: -#line 2217 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 215: +#line 2217 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const Type *Ty = yyvsp[0].PHIList->front().first->getType(); if (!Ty->isFirstClassType()) ThrowException("PHI node operands must be of first class type!"); @@ -3747,11 +4365,12 @@ yyvsp[0].PHIList->pop_front(); } delete yyvsp[0].PHIList; // Free the list... - ; - break;} -case 215: -#line 2231 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 216: +#line 2231 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PFTy; const FunctionType *Ty; @@ -3807,78 +4426,89 @@ cast(yyval.InstVal)->setCallingConv(yyvsp[-5].UIntVal); delete yyvsp[-4].TypeVal; delete yyvsp[-1].ValueList; - ; - break;} -case 216: -#line 2288 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 217: +#line 2288 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = yyvsp[0].InstVal; - ; - break;} -case 217: -#line 2294 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 218: +#line 2294 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = yyvsp[0].ValueList; - ; - break;} -case 218: -#line 2296 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 219: +#line 2296 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.ValueList = new std::vector(); - ; - break;} -case 219: -#line 2300 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 220: +#line 2300 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = true; - ; - break;} -case 220: -#line 2303 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 221: +#line 2303 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.BoolVal = false; - ; - break;} -case 221: -#line 2309 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 222: +#line 2309 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new MallocInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 222: -#line 2313 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 223: +#line 2313 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new MallocInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; - ; - break;} -case 223: -#line 2317 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 224: +#line 2317 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new AllocaInst(*yyvsp[-1].TypeVal, 0, yyvsp[0].UIntVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 224: -#line 2321 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 225: +#line 2321 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { yyval.InstVal = new AllocaInst(*yyvsp[-4].TypeVal, getVal(yyvsp[-2].PrimType, yyvsp[-1].ValIDVal), yyvsp[0].UIntVal); delete yyvsp[-4].TypeVal; - ; - break;} -case 225: -#line 2325 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 226: +#line 2325 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[0].ValueVal->getType())) ThrowException("Trying to free nonpointer type " + yyvsp[0].ValueVal->getType()->getDescription() + "!"); yyval.InstVal = new FreeInst(yyvsp[0].ValueVal); - ; - break;} -case 226: -#line 2332 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 227: +#line 2332 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-1].TypeVal->get())) ThrowException("Can't load from nonpointer type: " + (*yyvsp[-1].TypeVal)->getDescription()); @@ -3887,11 +4517,12 @@ (*yyvsp[-1].TypeVal)->getDescription()); yyval.InstVal = new LoadInst(getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal), "", yyvsp[-3].BoolVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 227: -#line 2342 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 228: +#line 2342 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { const PointerType *PT = dyn_cast(yyvsp[-1].TypeVal->get()); if (!PT) ThrowException("Can't store to a nonpointer type: " + @@ -3903,11 +4534,12 @@ yyval.InstVal = new StoreInst(yyvsp[-3].ValueVal, getVal(*yyvsp[-1].TypeVal, yyvsp[0].ValIDVal), yyvsp[-5].BoolVal); delete yyvsp[-1].TypeVal; - ; - break;} -case 228: -#line 2355 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" -{ + ;} + break; + + case 229: +#line 2355 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" + { if (!isa(yyvsp[-2].TypeVal->get())) ThrowException("getelementptr insn requires pointer operand!"); @@ -3927,231 +4559,239 @@ (*yyvsp[-2].TypeVal)->getDescription()+ "'!"); yyval.InstVal = new GetElementPtrInst(getVal(*yyvsp[-2].TypeVal, yyvsp[-1].ValIDVal), *yyvsp[0].ValueList); delete yyvsp[-2].TypeVal; delete yyvsp[0].ValueList; - ; - break;} -} - /* the action file gets copied in in place of this dollarsign */ -#line 543 "/usr/share/bison.simple" + ;} + break; + + + } + +/* Line 1000 of yacc.c. */ +#line 4570 "llvmAsmParser.tab.c" yyvsp -= yylen; yyssp -= yylen; -#ifdef YYLSP_NEEDED - yylsp -= yylen; -#endif -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif + + YY_STACK_PRINT (yyss, yyssp); *++yyvsp = yyval; -#ifdef YYLSP_NEEDED - yylsp++; - if (yylen == 0) - { - yylsp->first_line = yylloc.first_line; - yylsp->first_column = yylloc.first_column; - yylsp->last_line = (yylsp-1)->last_line; - yylsp->last_column = (yylsp-1)->last_column; - yylsp->text = 0; - } - else - { - yylsp->last_line = (yylsp+yylen-1)->last_line; - yylsp->last_column = (yylsp+yylen-1)->last_column; - } -#endif - /* Now "shift" the result of the reduction. - Determine what state that goes to, - based on the state we popped back to - and the rule number reduced by. */ + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ yyn = yyr1[yyn]; - yystate = yypgoto[yyn - YYNTBASE] + *yyssp; - if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) yystate = yytable[yystate]; else - yystate = yydefgoto[yyn - YYNTBASE]; + yystate = yydefgoto[yyn - YYNTOKENS]; goto yynewstate; -yyerrlab: /* here on detecting error */ - if (! yyerrstatus) - /* If not already recovering from an error, report this error. */ +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) { ++yynerrs; - -#ifdef YYERROR_VERBOSE +#if YYERROR_VERBOSE yyn = yypact[yystate]; - if (yyn > YYFLAG && yyn < YYLAST) + if (YYPACT_NINF < yyn && yyn < YYLAST) { - int size = 0; - char *msg; - int x, count; - - count = 0; - /* Start X at -yyn if nec to avoid negative indexes in yycheck. */ - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) - size += strlen(yytname[x]) + 15, count++; - msg = (char *) malloc(size + 15); - if (msg != 0) + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) { - strcpy(msg, "parse error"); + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); - if (count < 5) + if (yycount < 5) { - count = 0; - for (x = (yyn < 0 ? -yyn : 0); - x < (sizeof(yytname) / sizeof(char *)); x++) - if (yycheck[x + yyn] == x) + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) { - strcat(msg, count == 0 ? ", expecting `" : " or `"); - strcat(msg, yytname[x]); - strcat(msg, "'"); - count++; + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; } } - yyerror(msg); - free(msg); + yyerror (yymsg); + YYSTACK_FREE (yymsg); } else - yyerror ("parse error; also virtual memory exceeded"); + yyerror ("syntax error; also virtual memory exhausted"); } else #endif /* YYERROR_VERBOSE */ - yyerror("parse error"); + yyerror ("syntax error"); } - goto yyerrlab1; -yyerrlab1: /* here on error raised explicitly by an action */ + if (yyerrstatus == 3) { - /* if just tried and failed to reuse lookahead token after an error, discard it. */ + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ - /* return failure if at end of input */ - if (yychar == YYEOF) - YYABORT; - -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]); -#endif + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval); + yychar = YYEMPTY; - yychar = YYEMPTY; + } } - /* Else will try to reuse lookahead token - after shifting the error token. */ - - yyerrstatus = 3; /* Each real token shifted decrements this */ + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; - goto yyerrhandle; -yyerrdefault: /* current state does not do anything special for the error token. */ +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: -#if 0 - /* This is wrong; only states that explicitly want error tokens - should shift them. */ - yyn = yydefact[yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ - if (yyn) goto yydefault; +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; #endif -yyerrpop: /* pop the current state because it cannot handle the error token */ - - if (yyssp == yyss) YYABORT; - yyvsp--; - yystate = *--yyssp; -#ifdef YYLSP_NEEDED - yylsp--; -#endif + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + goto yyerrlab1; -#if YYDEBUG != 0 - if (yydebug) - { - short *ssp1 = yyss - 1; - fprintf (stderr, "Error: state stack now"); - while (ssp1 != yyssp) - fprintf (stderr, " %d", *++ssp1); - fprintf (stderr, "\n"); - } -#endif -yyerrhandle: +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ - yyn = yypact[yystate]; - if (yyn == YYFLAG) - goto yyerrdefault; + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } - yyn += YYTERROR; - if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR) - goto yyerrdefault; + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; - yyn = yytable[yyn]; - if (yyn < 0) - { - if (yyn == YYFLAG) - goto yyerrpop; - yyn = -yyn; - goto yyreduce; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); } - else if (yyn == 0) - goto yyerrpop; if (yyn == YYFINAL) YYACCEPT; -#if YYDEBUG != 0 - if (yydebug) - fprintf(stderr, "Shifting error token, "); -#endif + YYDPRINTF ((stderr, "Shifting error token, ")); *++yyvsp = yylval; -#ifdef YYLSP_NEEDED - *++yylsp = yylloc; -#endif + yystate = yyn; goto yynewstate; - yyacceptlab: - /* YYACCEPT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); -#endif - } - return 0; - yyabortlab: - /* YYABORT comes here. */ - if (yyfree_stacks) - { - free (yyss); - free (yyvs); -#ifdef YYLSP_NEEDED - free (yyls); +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); #endif - } - return 1; + return yyresult; } -#line 2378 "/Users/bocchino/llvm-checkin/src/lib/AsmParser/llvmAsmParser.y" + + +#line 2378 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" int yyerror(const char *ErrorMsg) { std::string where @@ -4165,3 +4805,4 @@ ThrowException(errMsg); return 0; } + Index: llvm/lib/AsmParser/llvmAsmParser.h diff -u llvm/lib/AsmParser/llvmAsmParser.h:1.15 llvm/lib/AsmParser/llvmAsmParser.h:1.16 --- llvm/lib/AsmParser/llvmAsmParser.h:1.15 Tue Jan 17 14:06:25 2006 +++ llvm/lib/AsmParser/llvmAsmParser.h Wed Jan 18 19:21:04 2006 @@ -1,4 +1,233 @@ -typedef union { +/* A Bison parser, made by GNU Bison 1.875c. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + ESINT64VAL = 258, + EUINT64VAL = 259, + SINTVAL = 260, + UINTVAL = 261, + FPVAL = 262, + VOID = 263, + BOOL = 264, + SBYTE = 265, + UBYTE = 266, + SHORT = 267, + USHORT = 268, + INT = 269, + UINT = 270, + LONG = 271, + ULONG = 272, + FLOAT = 273, + DOUBLE = 274, + TYPE = 275, + LABEL = 276, + VAR_ID = 277, + LABELSTR = 278, + STRINGCONSTANT = 279, + IMPLEMENTATION = 280, + ZEROINITIALIZER = 281, + TRUETOK = 282, + FALSETOK = 283, + BEGINTOK = 284, + ENDTOK = 285, + DECLARE = 286, + GLOBAL = 287, + CONSTANT = 288, + SECTION = 289, + VOLATILE = 290, + TO = 291, + DOTDOTDOT = 292, + NULL_TOK = 293, + UNDEF = 294, + CONST = 295, + INTERNAL = 296, + LINKONCE = 297, + WEAK = 298, + APPENDING = 299, + OPAQUE = 300, + NOT = 301, + EXTERNAL = 302, + TARGET = 303, + TRIPLE = 304, + ENDIAN = 305, + POINTERSIZE = 306, + LITTLE = 307, + BIG = 308, + ALIGN = 309, + DEPLIBS = 310, + CALL = 311, + TAIL = 312, + CC_TOK = 313, + CCC_TOK = 314, + FASTCC_TOK = 315, + COLDCC_TOK = 316, + RET = 317, + BR = 318, + SWITCH = 319, + INVOKE = 320, + UNWIND = 321, + UNREACHABLE = 322, + ADD = 323, + SUB = 324, + MUL = 325, + DIV = 326, + REM = 327, + AND = 328, + OR = 329, + XOR = 330, + SETLE = 331, + SETGE = 332, + SETLT = 333, + SETGT = 334, + SETEQ = 335, + SETNE = 336, + MALLOC = 337, + ALLOCA = 338, + FREE = 339, + LOAD = 340, + STORE = 341, + GETELEMENTPTR = 342, + PHI_TOK = 343, + CAST = 344, + SELECT = 345, + SHL = 346, + SHR = 347, + VAARG = 348, + EXTRACTELEMENT = 349, + INSERTELEMENT = 350, + VAARG_old = 351, + VANEXT_old = 352 + }; +#endif +#define ESINT64VAL 258 +#define EUINT64VAL 259 +#define SINTVAL 260 +#define UINTVAL 261 +#define FPVAL 262 +#define VOID 263 +#define BOOL 264 +#define SBYTE 265 +#define UBYTE 266 +#define SHORT 267 +#define USHORT 268 +#define INT 269 +#define UINT 270 +#define LONG 271 +#define ULONG 272 +#define FLOAT 273 +#define DOUBLE 274 +#define TYPE 275 +#define LABEL 276 +#define VAR_ID 277 +#define LABELSTR 278 +#define STRINGCONSTANT 279 +#define IMPLEMENTATION 280 +#define ZEROINITIALIZER 281 +#define TRUETOK 282 +#define FALSETOK 283 +#define BEGINTOK 284 +#define ENDTOK 285 +#define DECLARE 286 +#define GLOBAL 287 +#define CONSTANT 288 +#define SECTION 289 +#define VOLATILE 290 +#define TO 291 +#define DOTDOTDOT 292 +#define NULL_TOK 293 +#define UNDEF 294 +#define CONST 295 +#define INTERNAL 296 +#define LINKONCE 297 +#define WEAK 298 +#define APPENDING 299 +#define OPAQUE 300 +#define NOT 301 +#define EXTERNAL 302 +#define TARGET 303 +#define TRIPLE 304 +#define ENDIAN 305 +#define POINTERSIZE 306 +#define LITTLE 307 +#define BIG 308 +#define ALIGN 309 +#define DEPLIBS 310 +#define CALL 311 +#define TAIL 312 +#define CC_TOK 313 +#define CCC_TOK 314 +#define FASTCC_TOK 315 +#define COLDCC_TOK 316 +#define RET 317 +#define BR 318 +#define SWITCH 319 +#define INVOKE 320 +#define UNWIND 321 +#define UNREACHABLE 322 +#define ADD 323 +#define SUB 324 +#define MUL 325 +#define DIV 326 +#define REM 327 +#define AND 328 +#define OR 329 +#define XOR 330 +#define SETLE 331 +#define SETGE 332 +#define SETLT 333 +#define SETGT 334 +#define SETEQ 335 +#define SETNE 336 +#define MALLOC 337 +#define ALLOCA 338 +#define FREE 339 +#define LOAD 340 +#define STORE 341 +#define GETELEMENTPTR 342 +#define PHI_TOK 343 +#define CAST 344 +#define SELECT 345 +#define SHL 346 +#define SHR 347 +#define VAARG 348 +#define EXTRACTELEMENT 349 +#define INSERTELEMENT 350 +#define VAARG_old 351 +#define VANEXT_old 352 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 878 "/proj/llvm/llvm2/lib/AsmParser/llvmAsmParser.y" +typedef union YYSTYPE { llvm::Module *ModuleVal; llvm::Function *FunctionVal; std::pair *ArgVal; @@ -37,101 +266,14 @@ llvm::Instruction::OtherOps OtherOpVal; llvm::Module::Endianness Endianness; } YYSTYPE; -#define ESINT64VAL 257 -#define EUINT64VAL 258 -#define SINTVAL 259 -#define UINTVAL 260 -#define FPVAL 261 -#define VOID 262 -#define BOOL 263 -#define SBYTE 264 -#define UBYTE 265 -#define SHORT 266 -#define USHORT 267 -#define INT 268 -#define UINT 269 -#define LONG 270 -#define ULONG 271 -#define FLOAT 272 -#define DOUBLE 273 -#define TYPE 274 -#define LABEL 275 -#define VAR_ID 276 -#define LABELSTR 277 -#define STRINGCONSTANT 278 -#define IMPLEMENTATION 279 -#define ZEROINITIALIZER 280 -#define TRUETOK 281 -#define FALSETOK 282 -#define BEGINTOK 283 -#define ENDTOK 284 -#define DECLARE 285 -#define GLOBAL 286 -#define CONSTANT 287 -#define SECTION 288 -#define VOLATILE 289 -#define TO 290 -#define DOTDOTDOT 291 -#define NULL_TOK 292 -#define UNDEF 293 -#define CONST 294 -#define INTERNAL 295 -#define LINKONCE 296 -#define WEAK 297 -#define APPENDING 298 -#define OPAQUE 299 -#define NOT 300 -#define EXTERNAL 301 -#define TARGET 302 -#define TRIPLE 303 -#define ENDIAN 304 -#define POINTERSIZE 305 -#define LITTLE 306 -#define BIG 307 -#define ALIGN 308 -#define DEPLIBS 309 -#define CALL 310 -#define TAIL 311 -#define CC_TOK 312 -#define CCC_TOK 313 -#define FASTCC_TOK 314 -#define COLDCC_TOK 315 -#define RET 316 -#define BR 317 -#define SWITCH 318 -#define INVOKE 319 -#define UNWIND 320 -#define UNREACHABLE 321 -#define ADD 322 -#define SUB 323 -#define MUL 324 -#define DIV 325 -#define REM 326 -#define AND 327 -#define OR 328 -#define XOR 329 -#define SETLE 330 -#define SETGE 331 -#define SETLT 332 -#define SETGT 333 -#define SETEQ 334 -#define SETNE 335 -#define MALLOC 336 -#define ALLOCA 337 -#define FREE 338 -#define LOAD 339 -#define STORE 340 -#define GETELEMENTPTR 341 -#define PHI_TOK 342 -#define CAST 343 -#define SELECT 344 -#define SHL 345 -#define SHR 346 -#define VAARG 347 -#define EXTRACTELEMENT 348 -#define INSERTELEMENT 349 -#define VAARG_old 350 -#define VANEXT_old 351 - +/* Line 1275 of yacc.c. */ +#line 271 "llvmAsmParser.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif extern YYSTYPE llvmAsmlval; + + + Index: llvm/lib/AsmParser/llvmAsmParser.y diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.244 llvm/lib/AsmParser/llvmAsmParser.y:1.245 --- llvm/lib/AsmParser/llvmAsmParser.y:1.244 Tue Jan 17 14:06:25 2006 +++ llvm/lib/AsmParser/llvmAsmParser.y Wed Jan 18 19:21:04 2006 @@ -105,10 +105,10 @@ ThrowException(UndefinedReferences); } - // Rename any overloaded intrinsic functions. - for (Module::iterator FI = CurrentModule->begin(), FE = - CurrentModule->end(); FI != FE; ++FI) - UpgradeIntrinsicFunction(&(*FI)); + // Look for intrinsic functions and CallInst that need to be upgraded + for (Module::iterator FI = CurrentModule->begin(),FE = CurrentModule->end(); + FI != FE; ++FI) + UpgradeCallsToIntrinsic(FI); Values.clear(); // Clear out function local definitions Types.clear(); From evan.cheng at apple.com Wed Jan 18 19:46:26 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 19:46:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp X86ISelLowering.cpp Message-ID: <200601190146.TAA26501@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.33 -> 1.34 X86ISelLowering.cpp updated: 1.49 -> 1.50 --- Log message: A obvious typo --- Diffs of the changes: (+3 -1) X86ISelDAGToDAG.cpp | 2 ++ X86ISelLowering.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.33 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.34 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.33 Mon Jan 16 15:21:29 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Wed Jan 18 19:46:14 2006 @@ -215,6 +215,7 @@ /// the main function. static void EmitSpecialCodeForMain(MachineBasicBlock *BB, MachineFrameInfo *MFI) { +#if 0 // Switch the FPU to 64-bit precision mode for better compatibility and speed. int CWFrameIdx = MFI->CreateStackObject(2, 2); addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx); @@ -225,6 +226,7 @@ // Reload the modified control word now. addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx); +#endif } void X86DAGToDAGISel::EmitFunctionEntryCode(Function &Fn, MachineFunction &MF) { Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.49 llvm/lib/Target/X86/X86ISelLowering.cpp:1.50 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.49 Wed Jan 18 03:26:46 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Wed Jan 18 19:46:14 2006 @@ -1457,7 +1457,7 @@ Tmp3 = DAG.getNode(ISD::SHL, MVT::i32, ShOpLo, ShAmt); } else { Tmp2 = DAG.getNode(X86ISD::SHRD, MVT::i32, ShOpLo, ShOpHi, ShAmt); - Tmp3 = DAG.getNode(isSRA ? ISD::SRA : ISD::SHL, MVT::i32, ShOpHi, ShAmt); + Tmp3 = DAG.getNode(isSRA ? ISD::SRA : ISD::SRL, MVT::i32, ShOpHi, ShAmt); } SDOperand InFlag = DAG.getNode(X86ISD::TEST, MVT::Flag, From evan.cheng at apple.com Wed Jan 18 19:53:08 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 19:53:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Message-ID: <200601190153.TAA26539@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelDAGToDAG.cpp updated: 1.34 -> 1.35 --- Log message: Didn't mean to check that in. --- Diffs of the changes: (+0 -2) X86ISelDAGToDAG.cpp | 2 -- 1 files changed, 2 deletions(-) Index: llvm/lib/Target/X86/X86ISelDAGToDAG.cpp diff -u llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.34 llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.35 --- llvm/lib/Target/X86/X86ISelDAGToDAG.cpp:1.34 Wed Jan 18 19:46:14 2006 +++ llvm/lib/Target/X86/X86ISelDAGToDAG.cpp Wed Jan 18 19:52:56 2006 @@ -215,7 +215,6 @@ /// the main function. static void EmitSpecialCodeForMain(MachineBasicBlock *BB, MachineFrameInfo *MFI) { -#if 0 // Switch the FPU to 64-bit precision mode for better compatibility and speed. int CWFrameIdx = MFI->CreateStackObject(2, 2); addFrameReference(BuildMI(BB, X86::FNSTCW16m, 4), CWFrameIdx); @@ -226,7 +225,6 @@ // Reload the modified control word now. addFrameReference(BuildMI(BB, X86::FLDCW16m, 4), CWFrameIdx); -#endif } void X86DAGToDAGISel::EmitFunctionEntryCode(Function &Fn, MachineFunction &MF) { From evan.cheng at apple.com Wed Jan 18 19:55:57 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 19:55:57 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200601190155.TAA26599@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.135 -> 1.136 --- Log message: Prevent unnecessary CopyToReg when the same HW register appears in two spots in the pattern. --- Diffs of the changes: (+9 -0) DAGISelEmitter.cpp | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.135 llvm/utils/TableGen/DAGISelEmitter.cpp:1.136 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.135 Tue Jan 17 01:36:41 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Wed Jan 18 19:55:45 2006 @@ -1835,6 +1835,7 @@ std::map OperatorMap; // Names of all the folded nodes which produce chains. std::vector > FoldedChains; + std::set Duplicates; unsigned TmpNo; public: @@ -1952,6 +1953,7 @@ // previously named thing. OS << " if (" << VarMapEntry << " != " << RootName << OpNo << ") goto P" << PatternNo << "Fail;\n"; + Duplicates.insert(RootName + utostr(OpNo)); continue; } } @@ -2351,6 +2353,13 @@ EmitCopyToRegs(Child, RootName + utostr(OpNo), ChainEmitted); } else { if (DefInit *DI = dynamic_cast(Child->getLeafValue())) { + if (!Child->getName().empty()) { + std::string Name = RootName + utostr(OpNo); + if (Duplicates.find(Name) != Duplicates.end()) + // A duplicate! Do not emit a copy for this node. + continue; + } + Record *RR = DI->getDef(); if (RR->isSubClassOf("Register")) { MVT::ValueType RVT = getRegisterValueType(RR, T); From evan.cheng at apple.com Wed Jan 18 19:56:40 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 19:56:40 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200601190156.TAA26618@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.211 -> 1.212 --- Log message: Two peepholes: (or (x >> c) | (y << (32 - c))) ==> (shrd x, y, c) (or (x << c) | (y >> (32 - c))) ==> (shld x, y, c) --- Diffs of the changes: (+10 -0) X86InstrInfo.td | 10 ++++++++++ 1 files changed, 10 insertions(+) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.211 llvm/lib/Target/X86/X86InstrInfo.td:1.212 --- llvm/lib/Target/X86/X86InstrInfo.td:1.211 Tue Jan 17 01:02:46 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Wed Jan 18 19:56:29 2006 @@ -3066,3 +3066,13 @@ def : Pat<(shl R8 :$src1, (i8 1)), (ADD8rr R8 :$src1, R8 :$src1)>; def : Pat<(shl R16:$src1, (i8 1)), (ADD16rr R16:$src1, R16:$src1)>; def : Pat<(shl R32:$src1, (i8 1)), (ADD32rr R32:$src1, R32:$src1)>; + +// (or (x >> c) | (y << (32 - c))) ==> (shrd x, y, c) +def : Pat<(or (srl R32:$src1, CL:$amt), + (shl R32:$src2, (sub 32, CL:$amt))), + (SHRD32rrCL R32:$src1, R32:$src2)>; + +// (or (x << c) | (y >> (32 - c))) ==> (shld x, y, c) +def : Pat<(or (shl R32:$src1, CL:$amt), + (srl R32:$src2, (sub 32, CL:$amt))), + (SHLD32rrCL R32:$src1, R32:$src2)>; From lattner at cs.uiuc.edu Wed Jan 18 20:09:50 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Wed, 18 Jan 2006 20:09:50 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/README.txt Message-ID: <200601190209.UAA26778@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: README.txt updated: 1.45 -> 1.46 --- Log message: add a note --- Diffs of the changes: (+4 -0) README.txt | 4 ++++ 1 files changed, 4 insertions(+) Index: llvm/lib/Target/PowerPC/README.txt diff -u llvm/lib/Target/PowerPC/README.txt:1.45 llvm/lib/Target/PowerPC/README.txt:1.46 --- llvm/lib/Target/PowerPC/README.txt:1.45 Mon Jan 16 11:58:54 2006 +++ llvm/lib/Target/PowerPC/README.txt Wed Jan 18 20:09:38 2006 @@ -339,3 +339,7 @@ address of the struct to be CSE'd, avoiding PIC accesses (also reduces the size of the GOT on targets with one). +===-------------------------------------------------------------------------=== + +Generate lwbrx and other byteswapping load/store instructions when reasonable. + From evan.cheng at apple.com Wed Jan 18 22:55:04 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Wed, 18 Jan 2006 22:55:04 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601190455.WAA27633@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.270 -> 1.271 --- Log message: Another typo --- 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.270 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.271 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.270 Wed Jan 18 17:19:08 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Wed Jan 18 22:54:52 2006 @@ -2082,7 +2082,7 @@ Tmp2 = LegalizeOp(Tmp.getValue(i)); AddLegalizedOperand(SDOperand(Node, i), Tmp2); if (i == Op.ResNo) - RetVal = Tmp; + RetVal = Tmp2; } assert(RetVal.Val && "Illegal result number"); return RetVal; From reid at x10sys.com Wed Jan 18 23:37:39 2006 From: reid at x10sys.com (Reid Spencer) Date: Wed, 18 Jan 2006 23:37:39 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp Message-ID: <200601190537.XAA27790@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AutoUpgrade.cpp updated: 1.2 -> 1.3 --- Log message: Make get_suffix faster by using a switch on getTypeID rather than a series of comparisons on the various type objects. --- Diffs of the changes: (+9 -12) AutoUpgrade.cpp | 21 +++++++++------------ 1 files changed, 9 insertions(+), 12 deletions(-) Index: llvm/lib/VMCore/AutoUpgrade.cpp diff -u llvm/lib/VMCore/AutoUpgrade.cpp:1.2 llvm/lib/VMCore/AutoUpgrade.cpp:1.3 --- llvm/lib/VMCore/AutoUpgrade.cpp:1.2 Wed Jan 18 19:18:29 2006 +++ llvm/lib/VMCore/AutoUpgrade.cpp Wed Jan 18 23:37:27 2006 @@ -24,18 +24,15 @@ // Utility function for getting the correct suffix given a type static inline const char* get_suffix(const Type* Ty) { - if (Ty == Type::UIntTy) - return ".i32"; - if (Ty == Type::UShortTy) - return ".i16"; - if (Ty == Type::UByteTy) - return ".i8"; - if (Ty == Type::ULongTy) - return ".i64"; - if (Ty == Type::FloatTy) - return ".f32"; - if (Ty == Type::DoubleTy) - return ".f64"; + switch (Ty->getTypeID()) { + case Type::UIntTyID: return ".i32"; + case Type::UShortTyID: return ".i16"; + case Type::UByteTyID: return ".i8"; + case Type::ULongTyID: return ".i64"; + case Type::FloatTyID: return ".f32"; + case Type::DoubleTyID: return ".f64"; + default: break; + } return 0; } From lattner at cs.uiuc.edu Thu Jan 19 00:15:46 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 00:15:46 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Bytecode/old-intrinsics.ll old-intrinsics.ll.bc-16 Message-ID: <200601190615.AAA27987@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Bytecode: old-intrinsics.ll added (r1.1) old-intrinsics.ll.bc-16 added (r1.1) --- Log message: new testcase the autoupgrader in the bc reader fails to handle --- Diffs of the changes: (+4 -0) old-intrinsics.ll | 4 ++++ old-intrinsics.ll.bc-16 | 0 2 files changed, 4 insertions(+) Index: llvm/test/Regression/Bytecode/old-intrinsics.ll diff -c /dev/null llvm/test/Regression/Bytecode/old-intrinsics.ll:1.1 *** /dev/null Thu Jan 19 00:15:44 2006 --- llvm/test/Regression/Bytecode/old-intrinsics.ll Thu Jan 19 00:15:34 2006 *************** *** 0 **** --- 1,4 ---- + ; RUN: llvm-dis %s.bc-16 -o /dev/null -f + ; XFAIL: * + ; Just see if we can disassemble the bc file corresponding to this file. + Index: llvm/test/Regression/Bytecode/old-intrinsics.ll.bc-16 From lattner at cs.uiuc.edu Thu Jan 19 00:49:57 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 00:49:57 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CFrontend/2006-01-13-Includes.c Message-ID: <200601190649.AAA28112@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CFrontend: 2006-01-13-Includes.c updated: 1.1 -> 1.2 --- Log message: make this work for Reid, who renamed his CVS module dir :) --- Diffs of the changes: (+1 -2) 2006-01-13-Includes.c | 3 +-- 1 files changed, 1 insertion(+), 2 deletions(-) Index: llvm/test/Regression/CFrontend/2006-01-13-Includes.c diff -u llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.1 llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.2 --- llvm/test/Regression/CFrontend/2006-01-13-Includes.c:1.1 Fri Jan 13 18:29:48 2006 +++ llvm/test/Regression/CFrontend/2006-01-13-Includes.c Thu Jan 19 00:49:46 2006 @@ -1,5 +1,4 @@ -// RUN: %llvmgcc %s -g -S -o - | gccas | llvm-dis | grep "llvm/test/Regression/CFrontend" - +// RUN: %llvmgcc %s -g -S -o - | gccas | llvm-dis | grep "test/Regression/CFrontend" // PR676 #include From evan.cheng at apple.com Thu Jan 19 00:53:32 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 00:53:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td Message-ID: <200601190653.AAA28135@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.212 -> 1.213 --- Log message: adc and sbb need an incoming flag to ensure it reads the carry flag from add / sub. --- 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.212 llvm/lib/Target/X86/X86InstrInfo.td:1.213 --- llvm/lib/Target/X86/X86InstrInfo.td:1.212 Wed Jan 18 19:56:29 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Thu Jan 19 00:53:20 2006 @@ -63,8 +63,9 @@ def X86subflag : SDNode<"X86ISD::SUB_FLAG", SDTIntBinOp, [SDNPOutFlag]>; def X86adc : SDNode<"X86ISD::ADC" , SDTIntBinOp , - [SDNPCommutative, SDNPAssociative]>; -def X86sbb : SDNode<"X86ISD::SBB" , SDTIntBinOp>; + [SDNPCommutative, SDNPAssociative, SDNPInFlag]>; +def X86sbb : SDNode<"X86ISD::SBB" , SDTIntBinOp, + [SDNPInFlag]>; def X86shld : SDNode<"X86ISD::SHLD", SDTIntShiftDOp>; def X86shrd : SDNode<"X86ISD::SHRD", SDTIntShiftDOp>; From reid at x10sys.com Thu Jan 19 00:58:10 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 00:58:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.h Message-ID: <200601190658.AAA28184@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.h updated: 1.25 -> 1.26 --- Log message: Add a flag to identify bytecode files that have intrinsic functions that need to be upgraded. --- Diffs of the changes: (+7 -0) Reader.h | 7 +++++++ 1 files changed, 7 insertions(+) Index: llvm/lib/Bytecode/Reader/Reader.h diff -u llvm/lib/Bytecode/Reader/Reader.h:1.25 llvm/lib/Bytecode/Reader/Reader.h:1.26 --- llvm/lib/Bytecode/Reader/Reader.h:1.25 Mon Oct 3 16:26:53 2005 +++ llvm/lib/Bytecode/Reader/Reader.h Thu Jan 19 00:57:58 2006 @@ -321,6 +321,12 @@ // unreachable instruction. bool hasNoUnreachableInst; + /// In release 1.7 we changed intrinsic functions to not be overloaded. There + /// is no bytecode change for this, but to optimize the auto-upgrade of calls + /// to intrinsic functions, we set this flag to identify when a module has + /// been read that contains intrinsics that were upgraded. + bool hasUpgradedIntrinsicFunctions; + /// CompactionTypes - If a compaction table is active in the current function, /// this is the mapping that it contains. We keep track of what resolved type /// it is as well as what global type entry it is. @@ -389,6 +395,7 @@ /// @brief Handler for parsing events. BytecodeHandler* Handler; + /// @} /// @name Implementation Details /// @{ From reid at x10sys.com Thu Jan 19 00:59:38 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 00:59:38 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Assembly/AutoUpgrade.h Message-ID: <200601190659.AAA28199@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Assembly: AutoUpgrade.h updated: 1.2 -> 1.3 --- Log message: 1. Documentation upgrade. 2. Have UpgradeInstrinicCall return an Instruction* instead of a CallInst* and return the needed CastInst* if the result of the upgraded call needs to be casted back to a signed type. --- Diffs of the changes: (+17 -8) AutoUpgrade.h | 25 +++++++++++++++++-------- 1 files changed, 17 insertions(+), 8 deletions(-) Index: llvm/include/llvm/Assembly/AutoUpgrade.h diff -u llvm/include/llvm/Assembly/AutoUpgrade.h:1.2 llvm/include/llvm/Assembly/AutoUpgrade.h:1.3 --- llvm/include/llvm/Assembly/AutoUpgrade.h:1.2 Wed Jan 18 19:18:29 2006 +++ llvm/include/llvm/Assembly/AutoUpgrade.h Thu Jan 19 00:59:26 2006 @@ -19,6 +19,7 @@ namespace llvm { class Function; class CallInst; + class Instruction; /// This function determines if the \p Name provides is a name for which the /// auto-upgrade to a non-overloaded name applies. @@ -38,18 +39,26 @@ /// @brief Remove overloaded intrinsic function names. Function* UpgradeIntrinsicFunction(Function* F); - /// This function inspects the CallInst \p CI to see if it is a call to an - /// old overloaded intrinsic. If it is, the CallInst's name is changed to add - /// a suffix that indicates the kind of arguments or result that it accepts. /// In LLVM 1.7, the overloading of intrinsic functions was replaced with /// separate functions for each of the various argument sizes. This function /// implements the auto-upgrade feature from old overloaded names to the new - /// non-overloaded names. + /// non-overloaded names. This function inspects the CallInst \p CI to see + /// if it is a call to an old overloaded intrinsic. If it is, a new CallInst + /// is created that uses the correct Function and possibly casts the + /// argument and result to an unsigned type. The caller can use the + /// returned Instruction to replace the existing one. Note that the + /// Instruction* returned could be a CallInst or a CastInst depending on + /// whether casting was necessary. /// @param CI The CallInst to potentially auto-upgrade. - /// @returns True if the call was upgraded, false otherwise. - /// @brief Replace overloaded intrinsic function calls. - CallInst* UpgradeIntrinsicCall(CallInst* CI); - + /// @returns An instrution to replace \p CI with. + /// @brief Get replacement instruction for overloaded intrinsic function call. + Instruction* UpgradeIntrinsicCall(CallInst* CI); + + /// Upgrade both the function and all the calls made to it, if that function + /// needs to be upgraded. This is like a combination of the above two + /// functions, UpgradeIntrinsicFunction and UpgradeIntrinsicCall. Note that + /// the calls are replaced so this should only be used in a post-processing + /// manner (i.e. after all assembly/bytecode has been read). bool UpgradeCallsToIntrinsic(Function* F); } // End llvm namespace From reid at x10sys.com Thu Jan 19 01:00:41 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 01:00:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp Message-ID: <200601190700.BAA28247@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AutoUpgrade.cpp updated: 1.3 -> 1.4 --- Log message: Don't forget about casting the result of an upgraded call to an intrinsic in the case where it needs to cast back to a signed type. --- Diffs of the changes: (+4 -1) AutoUpgrade.cpp | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/VMCore/AutoUpgrade.cpp diff -u llvm/lib/VMCore/AutoUpgrade.cpp:1.3 llvm/lib/VMCore/AutoUpgrade.cpp:1.4 --- llvm/lib/VMCore/AutoUpgrade.cpp:1.3 Wed Jan 18 23:37:27 2006 +++ llvm/lib/VMCore/AutoUpgrade.cpp Thu Jan 19 01:00:29 2006 @@ -141,7 +141,7 @@ return 0; } -CallInst* llvm::UpgradeIntrinsicCall(CallInst *CI) { +Instruction* llvm::UpgradeIntrinsicCall(CallInst *CI) { Function *F = CI->getCalledFunction(); if (const Type* Ty = get_type(F)) { Function* newF = UpgradeIntrinsicFunction(F); @@ -154,6 +154,9 @@ const Type* newTy = Ty->getUnsignedVersion(); newCI->setOperand(1,new CastInst(newCI->getOperand(1), newTy, "autoupgrade_cast", newCI)); + CastInst* final = new CastInst(newCI, Ty, "autoupgrade_uncast",newCI); + newCI->moveBefore(final); + return final; } return newCI; } From reid at x10sys.com Thu Jan 19 01:02:27 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 01:02:27 -0600 Subject: [llvm-commits] CVS: llvm/lib/Bytecode/Reader/Reader.cpp Message-ID: <200601190702.BAA28292@zion.cs.uiuc.edu> Changes in directory llvm/lib/Bytecode/Reader: Reader.cpp updated: 1.179 -> 1.180 --- Log message: 1. Identify bytecode modules that have upgraded intrinsics by setting a boolean flag if we read a function prototype that needs upgrading. 2. Don't upgrade the CallInst instruction until after its been inserted into the basic block, and only if we know that we have seen an upgraded intrinsic function. --- Diffs of the changes: (+19 -7) Reader.cpp | 26 +++++++++++++++++++------- 1 files changed, 19 insertions(+), 7 deletions(-) Index: llvm/lib/Bytecode/Reader/Reader.cpp diff -u llvm/lib/Bytecode/Reader/Reader.cpp:1.179 llvm/lib/Bytecode/Reader/Reader.cpp:1.180 --- llvm/lib/Bytecode/Reader/Reader.cpp:1.179 Wed Jan 18 19:21:04 2006 +++ llvm/lib/Bytecode/Reader/Reader.cpp Thu Jan 19 01:02:16 2006 @@ -670,6 +670,7 @@ getValue(iType, Oprnds[0]), getValue(iType, Oprnds[1])); + bool isCall = false; switch (Opcode) { default: if (Result == 0) @@ -857,13 +858,9 @@ } Result = new CallInst(F, Params); - if (CallInst* newCI = UpgradeIntrinsicCall(cast(Result))) { - Result->replaceAllUsesWith(newCI); - Result->eraseFromParent(); - Result = newCI; - } if (isTailCall) cast(Result)->setTailCall(); if (CallingConv) cast(Result)->setCallingConv(CallingConv); + isCall = true; break; } case 56: // Invoke with encoded CC @@ -1034,6 +1031,15 @@ break; } // end switch(Opcode) + BB->getInstList().push_back(Result); + + if (this->hasUpgradedIntrinsicFunctions && isCall) + if (Instruction* inst = UpgradeIntrinsicCall(cast(Result))) { + Result->replaceAllUsesWith(inst); + Result->eraseFromParent(); + Result = inst; + } + unsigned TypeSlot; if (Result->getType() == InstTy) TypeSlot = iType; @@ -1041,7 +1047,6 @@ TypeSlot = getTypeSlot(Result->getType()); insertValue(Result, TypeSlot, FunctionValues); - BB->getInstList().push_back(Result); } /// Get a particular numbered basic block, which might be a forward reference. @@ -2026,7 +2031,14 @@ // Insert the place holder. Function *Func = new Function(FTy, GlobalValue::ExternalLinkage, "", TheModule); - UpgradeIntrinsicFunction(Func); + + // Replace with upgraded intrinsic function, if applicable. + if (Function* upgrdF = UpgradeIntrinsicFunction(Func)) { + hasUpgradedIntrinsicFunctions = true; + Func->eraseFromParent(); + Func = upgrdF; + } + insertValue(Func, (FnSignature & (~0U >> 1)) >> 5, ModuleValues); // Flags are not used yet. From reid at x10sys.com Thu Jan 19 01:16:39 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 01:16:39 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Bytecode/old-intrinsics.ll Message-ID: <200601190716.BAA28390@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Bytecode: old-intrinsics.ll updated: 1.1 -> 1.2 --- Log message: This test passes now. --- Diffs of the changes: (+0 -1) old-intrinsics.ll | 1 - 1 files changed, 1 deletion(-) Index: llvm/test/Regression/Bytecode/old-intrinsics.ll diff -u llvm/test/Regression/Bytecode/old-intrinsics.ll:1.1 llvm/test/Regression/Bytecode/old-intrinsics.ll:1.2 --- llvm/test/Regression/Bytecode/old-intrinsics.ll:1.1 Thu Jan 19 00:15:34 2006 +++ llvm/test/Regression/Bytecode/old-intrinsics.ll Thu Jan 19 01:15:47 2006 @@ -1,4 +1,3 @@ ; RUN: llvm-dis %s.bc-16 -o /dev/null -f -; XFAIL: * ; Just see if we can disassemble the bc file corresponding to this file. From lattner at cs.uiuc.edu Thu Jan 19 01:23:22 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 01:23:22 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Message-ID: <200601190723.BAA28448@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/SparcV8: SparcV8ISelDAGToDAG.cpp updated: 1.55 -> 1.56 --- Log message: implement support for f32 arguments past the first 6 words --- Diffs of the changes: (+5 -0) SparcV8ISelDAGToDAG.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp diff -u llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.55 llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.56 --- llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp:1.55 Sun Jan 15 19:40:00 2006 +++ llvm/lib/Target/SparcV8/SparcV8ISelDAGToDAG.cpp Thu Jan 19 01:22:29 2006 @@ -266,6 +266,11 @@ Arg = DAG.getNode(ISD::BIT_CONVERT, MVT::f32, Arg); ArgValues.push_back(Arg); + } else { + int FrameIdx = MF.getFrameInfo()->CreateFixedObject(4, ArgOffset); + SDOperand FIPtr = DAG.getFrameIndex(FrameIdx, MVT::i32); + SDOperand Load = DAG.getLoad(MVT::f32, Root, FIPtr, DAG.getSrcValue(0)); + ArgValues.push_back(Load); } ArgOffset += 4; break; From lattner at cs.uiuc.edu Thu Jan 19 01:39:32 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 01:39:32 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Transforms/InstCombine/cast.ll Message-ID: <200601190739.BAA28593@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Transforms/InstCombine: cast.ll updated: 1.25 -> 1.26 --- Log message: Add a new testcase for an eliminable cast --- Diffs of the changes: (+5 -0) cast.ll | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/test/Regression/Transforms/InstCombine/cast.ll diff -u llvm/test/Regression/Transforms/InstCombine/cast.ll:1.25 llvm/test/Regression/Transforms/InstCombine/cast.ll:1.26 --- llvm/test/Regression/Transforms/InstCombine/cast.ll:1.25 Sun Jan 30 23:51:18 2005 +++ llvm/test/Regression/Transforms/InstCombine/cast.ll Thu Jan 19 01:39:20 2006 @@ -161,3 +161,8 @@ ret void } +int %test26(float %F) { + %c = cast float %F to double ;; no need to cast from float->double. + %D = cast double %c to int + ret int %D +} From lattner at cs.uiuc.edu Thu Jan 19 01:40:34 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 01:40:34 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/Scalar/InstructionCombining.cpp Message-ID: <200601190740.BAA28608@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Scalar: InstructionCombining.cpp updated: 1.415 -> 1.416 --- Log message: Implement casts.ll:test26: a cast from float -> double -> integer, doesn't need the float->double part. --- Diffs of the changes: (+11 -2) InstructionCombining.cpp | 13 +++++++++++-- 1 files changed, 11 insertions(+), 2 deletions(-) Index: llvm/lib/Transforms/Scalar/InstructionCombining.cpp diff -u llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.415 llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.416 --- llvm/lib/Transforms/Scalar/InstructionCombining.cpp:1.415 Mon Jan 16 13:47:21 2006 +++ llvm/lib/Transforms/Scalar/InstructionCombining.cpp Thu Jan 19 01:40:22 2006 @@ -3799,8 +3799,8 @@ // isEliminableCastOfCast - Return true if it is valid to eliminate the CI // instruction. // -static inline bool isEliminableCastOfCast(const Type *SrcTy, const Type *MidTy, - const Type *DstTy, TargetData *TD) { +static bool isEliminableCastOfCast(const Type *SrcTy, const Type *MidTy, + const Type *DstTy, TargetData *TD) { // It is legal to eliminate the instruction if casting A->B->A if the sizes // are identical and the bits don't get reinterpreted (for example @@ -3856,6 +3856,15 @@ return ResultCast == FirstCast; } } + + // If this is a cast from 'float -> double -> integer', cast from + // 'float -> integer' directly, as the value isn't changed by the + // float->double conversion. + if (SrcTy->isFloatingPoint() && MidTy->isFloatingPoint() && + DstTy->isIntegral() && + SrcTy->getPrimitiveSize() < MidTy->getPrimitiveSize()) + return true; + return false; } From reid at x10sys.com Thu Jan 19 02:22:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:22:53 -0600 Subject: [llvm-commits] CVS: llvm/configure Message-ID: <200601190822.CAA00607@zion.cs.uiuc.edu> Changes in directory llvm: configure updated: 1.205 -> 1.206 --- Log message: For PR696: http://llvm.cs.uiuc.edu/PR696 : Add checks for ceil, ceilf, floor, and floorf --- Diffs of the changes: (+6 -2) configure | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) Index: llvm/configure diff -u llvm/configure:1.205 llvm/configure:1.206 --- llvm/configure:1.205 Tue Dec 20 21:31:52 2005 +++ llvm/configure Thu Jan 19 02:22:40 2006 @@ -27752,7 +27752,10 @@ -for ac_func in backtrace getcwd getpagesize getrusage gettimeofday + + + +for ac_func in backtrace ceil ceilf floor floorf getcwd getpagesize getrusage do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 @@ -27857,7 +27860,8 @@ -for ac_func in isatty mkdtemp mkstemp mktemp + +for ac_func in gettimeofday isatty mkdtemp mkstemp mktemp do as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` echo "$as_me:$LINENO: checking for $ac_func" >&5 From reid at x10sys.com Thu Jan 19 02:22:53 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:22:53 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Config/config.h.in Message-ID: <200601190822.CAA00610@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Config: config.h.in updated: 1.59 -> 1.60 --- Log message: For PR696: http://llvm.cs.uiuc.edu/PR696 : Add checks for ceil, ceilf, floor, and floorf --- Diffs of the changes: (+12 -0) config.h.in | 12 ++++++++++++ 1 files changed, 12 insertions(+) Index: llvm/include/llvm/Config/config.h.in diff -u llvm/include/llvm/Config/config.h.in:1.59 llvm/include/llvm/Config/config.h.in:1.60 --- llvm/include/llvm/Config/config.h.in:1.59 Mon Nov 14 01:24:17 2005 +++ llvm/include/llvm/Config/config.h.in Thu Jan 19 02:22:40 2006 @@ -51,6 +51,12 @@ /* Does not have bi-directional iterator */ #undef HAVE_BI_ITERATOR +/* Define to 1 if you have the `ceil' function. */ +#undef HAVE_CEIL + +/* Define to 1 if you have the `ceilf' function. */ +#undef HAVE_CEILF + /* Define to 1 if you have the `closedir' function. */ #undef HAVE_CLOSEDIR @@ -97,6 +103,12 @@ /* Set to 1 if the finite function is found in */ #undef HAVE_FINITE_IN_IEEEFP_H +/* Define to 1 if you have the `floor' function. */ +#undef HAVE_FLOOR + +/* Define to 1 if you have the `floorf' function. */ +#undef HAVE_FLOORF + /* Does not have forward iterator */ #undef HAVE_FWD_ITERATOR From reid at x10sys.com Thu Jan 19 02:22:54 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:22:54 -0600 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200601190822.CAA00618@zion.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.202 -> 1.203 --- Log message: For PR696: http://llvm.cs.uiuc.edu/PR696 : Add checks for ceil, ceilf, floor, and floorf --- Diffs of the changes: (+2 -2) configure.ac | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.202 llvm/autoconf/configure.ac:1.203 --- llvm/autoconf/configure.ac:1.202 Tue Dec 20 21:31:53 2005 +++ llvm/autoconf/configure.ac Thu Jan 19 02:22:40 2006 @@ -523,8 +523,8 @@ dnl=== dnl===-----------------------------------------------------------------------=== -AC_CHECK_FUNCS([backtrace getcwd getpagesize getrusage gettimeofday ]) -AC_CHECK_FUNCS([isatty mkdtemp mkstemp mktemp ]) +AC_CHECK_FUNCS([backtrace ceil ceilf floor floorf getcwd getpagesize getrusage]) +AC_CHECK_FUNCS([gettimeofday isatty mkdtemp mkstemp mktemp ]) AC_CHECK_FUNCS([realpath sbrk setrlimit strdup strerror strerror_r ]) AC_CHECK_FUNCS([strtoll strtoq sysconf malloc_zone_statistics ]) AC_C_PRINTF_A From reid at x10sys.com Thu Jan 19 02:31:48 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:31:48 -0600 Subject: [llvm-commits] CVS: llvm/configure Message-ID: <200601190831.CAA03859@zion.cs.uiuc.edu> Changes in directory llvm: configure updated: 1.206 -> 1.207 --- Log message: Make sure that libm is used during config tests so that ceil, floor, and friends are actually detected. --- Diffs of the changes: (+73 -0) configure | 73 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 73 insertions(+) Index: llvm/configure diff -u llvm/configure:1.206 llvm/configure:1.207 --- llvm/configure:1.206 Thu Jan 19 02:22:40 2006 +++ llvm/configure Thu Jan 19 02:31:08 2006 @@ -24981,6 +24981,79 @@ fi +echo "$as_me:$LINENO: checking for sin in -lm" >&5 +echo $ECHO_N "checking for sin in -lm... $ECHO_C" >&6 +if test "${ac_cv_lib_m_sin+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char sin (); +int +main () +{ +sin (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_m_sin=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_m_sin=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_m_sin" >&5 +echo "${ECHO_T}$ac_cv_lib_m_sin" >&6 +if test $ac_cv_lib_m_sin = yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBM 1 +_ACEOF + + LIBS="-lm $LIBS" + +fi + echo "$as_me:$LINENO: checking for library containing lt_dlopen" >&5 echo $ECHO_N "checking for library containing lt_dlopen... $ECHO_C" >&6 From reid at x10sys.com Thu Jan 19 02:31:48 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:31:48 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/Config/config.h.in Message-ID: <200601190831.CAA03865@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/Config: config.h.in updated: 1.60 -> 1.61 --- Log message: Make sure that libm is used during config tests so that ceil, floor, and friends are actually detected. --- Diffs of the changes: (+3 -0) config.h.in | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/include/llvm/Config/config.h.in diff -u llvm/include/llvm/Config/config.h.in:1.60 llvm/include/llvm/Config/config.h.in:1.61 --- llvm/include/llvm/Config/config.h.in:1.60 Thu Jan 19 02:22:40 2006 +++ llvm/include/llvm/Config/config.h.in Thu Jan 19 02:31:08 2006 @@ -172,6 +172,9 @@ /* Define to 1 if you have the `elf' library (-lelf). */ #undef HAVE_LIBELF +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + /* Define to 1 if you have the `pthread' library (-lpthread). */ #undef HAVE_LIBPTHREAD From reid at x10sys.com Thu Jan 19 02:31:48 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:31:48 -0600 Subject: [llvm-commits] CVS: llvm/autoconf/configure.ac Message-ID: <200601190831.CAA03862@zion.cs.uiuc.edu> Changes in directory llvm/autoconf: configure.ac updated: 1.203 -> 1.204 --- Log message: Make sure that libm is used during config tests so that ceil, floor, and friends are actually detected. --- Diffs of the changes: (+1 -1) configure.ac | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/autoconf/configure.ac diff -u llvm/autoconf/configure.ac:1.203 llvm/autoconf/configure.ac:1.204 --- llvm/autoconf/configure.ac:1.203 Thu Jan 19 02:22:40 2006 +++ llvm/autoconf/configure.ac Thu Jan 19 02:31:08 2006 @@ -450,7 +450,7 @@ dnl libelf is for sparc only; we can ignore it if we don't have it AC_CHECK_LIB(elf, elf_begin) - +AC_CHECK_LIB(m,sin) dnl lt_dlopen may be required for plugin support. AC_SEARCH_LIBS(lt_dlopen,ltdl,AC_DEFINE([HAVE_LT_DLOPEN],[1], From duraid at octopus.com.au Thu Jan 19 02:32:03 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 19 Jan 2006 02:32:03 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelLowering.cpp Message-ID: <200601190832.CAA04137@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelLowering.cpp updated: 1.22 -> 1.23 --- Log message: fix calls that return f32 --- Diffs of the changes: (+7 -2) IA64ISelLowering.cpp | 9 +++++++-- 1 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.22 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.23 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.22 Sun Jan 15 03:45:23 2006 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Thu Jan 19 02:31:51 2006 @@ -473,7 +473,7 @@ SDOperand RetVal; if (RetTyVT != MVT::isVoid) { switch (RetTyVT) { - default: // assert(0 && "Unknown value type to return!"); + default: assert(0 && "Unknown value type to return!"); case MVT::i1: { // bools are just like other integers (returned in r8) SDOperand boolInR8 = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); InFlag = boolInR8.getValue(2); @@ -491,7 +491,7 @@ RetVal = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); Chain = RetVal.getValue(1); - // Add a note to keep track of whether it is sign or zero extended - TODO: bools + // keep track of whether it is sign or zero extended (todo: bools?) RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext :ISD::AssertZext, MVT::i64, RetVal, DAG.getValueType(RetTyVT)); RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal); @@ -501,6 +501,11 @@ Chain = RetVal.getValue(1); InFlag = RetVal.getValue(2); // XXX dead break; + case MVT::f32: + RetVal = DAG.getCopyFromReg(Chain, IA64::F8, MVT::f64, InFlag); + Chain = RetVal.getValue(1); + RetVal = DAG.getNode(ISD::TRUNCATE, MVT::f32, RetVal); + break; case MVT::f64: RetVal = DAG.getCopyFromReg(Chain, IA64::F8, MVT::f64, InFlag); Chain = RetVal.getValue(1); From reid at x10sys.com Thu Jan 19 02:37:08 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 02:37:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Message-ID: <200601190837.CAA06119@zion.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/IPO: SimplifyLibCalls.cpp updated: 1.56 -> 1.57 --- Log message: For PR696: http://llvm.cs.uiuc.edu/PR696 : Don't do floor->floorf conversion if floorf is not available. This checks the compiler's host, not its target, which is incorrect for cross-compilers Not sure that's important as we don't build many cross-compilers. --- Diffs of the changes: (+9 -0) SimplifyLibCalls.cpp | 9 +++++++++ 1 files changed, 9 insertions(+) Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.56 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.57 --- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.56 Tue Jan 17 12:27:17 2006 +++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp Thu Jan 19 02:36:56 2006 @@ -25,6 +25,7 @@ #include "llvm/Pass.h" #include "llvm/ADT/hash_map" #include "llvm/ADT/Statistic.h" +#include "llvm/Config/config.h" #include "llvm/Support/Debug.h" #include "llvm/Target/TargetData.h" #include "llvm/Transforms/IPO.h" @@ -317,12 +318,14 @@ return memcpy_func; } +#ifdef HAVE_FLOORF Function* get_floorf() { if (!floorf_func) floorf_func = M->getOrInsertFunction("floorf", Type::FloatTy, Type::FloatTy, (Type *)0); return floorf_func; } +#endif private: /// @brief Reset our cached data for a new Module @@ -337,7 +340,9 @@ sqrt_func = 0; strcpy_func = 0; strlen_func = 0; +#ifdef HAVE_FLOORF floorf_func = 0; +#endif } private: @@ -348,7 +353,9 @@ Function* sqrt_func; ///< Cached sqrt function Function* strcpy_func; ///< Cached strcpy function Function* strlen_func; ///< Cached strlen function +#ifdef HAVE_FLOORF Function* floorf_func; ///< Cached floorf function +#endif Module* M; ///< Cached Module TargetData* TD; ///< Cached TargetData }; @@ -1906,6 +1913,7 @@ } FFSLLOptimizer; +#ifdef HAVE_FLOORF /// This LibCallOptimization will simplify calls to the "floor" library /// function. /// @brief Simplify the floor library function. @@ -1937,6 +1945,7 @@ return false; // opt failed } } FloorOptimizer; +#endif From evan.cheng at apple.com Thu Jan 19 02:52:58 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 02:52:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601190852.CAA06219@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.50 -> 1.51 --- Log message: Avoid generating a redundant setcc. --- Diffs of the changes: (+0 -1) X86ISelLowering.cpp | 1 - 1 files changed, 1 deletion(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.50 llvm/lib/Target/X86/X86ISelLowering.cpp:1.51 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.50 Wed Jan 18 19:46:14 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Thu Jan 19 02:52:46 2006 @@ -1697,7 +1697,6 @@ CC = DAG.getConstant(X86CC, MVT::i8); Cond = DAG.getNode(X86ISD::CMP, MVT::Flag, Op0.getOperand(0), Op0.getOperand(1)); - addTest = true; } else addTest = true; From evan.cheng at apple.com Thu Jan 19 04:13:15 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 04:13:15 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200601191013.EAA04148@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.136 -> 1.137 --- Log message: Use pattern information to determine whether the use expects this instruction to produce a result. e.g MUL8m, the instruction does not produce a explicit result. However it produces an implicit result in AL which would be copied to a temp. The root operator of the matching pattern is a mul so the use would expect it to produce a result. --- Diffs of the changes: (+5 -2) DAGISelEmitter.cpp | 7 +++++-- 1 files changed, 5 insertions(+), 2 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.136 llvm/utils/TableGen/DAGISelEmitter.cpp:1.137 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.136 Wed Jan 18 19:55:45 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Jan 19 04:12:58 2006 @@ -2255,10 +2255,13 @@ OS << " CodeGenMap[N.getValue(" << ValNo << ")] = InFlag;\n"; if (AddedChain && HasOutFlag) { - if (NumResults == 0) { + // Is this pattern expected to produce a result? + if (Pattern->getTypeNum(0) == MVT::isVoid || + Pattern->getTypeNum(0) == MVT::Flag) { OS << " return Result.getValue(N.ResNo+1);\n"; } else { - OS << " if (N.ResNo < " << NumResults << ")\n"; + OS << " if (N.ResNo < " + << ((NumResults > 1) ? NumResults : 1) << ")\n"; OS << " return Result.getValue(N.ResNo);\n"; OS << " else\n"; OS << " return Result.getValue(N.ResNo+1);\n"; From duraid at octopus.com.au Thu Jan 19 08:13:32 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 19 Jan 2006 08:13:32 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64TargetMachine.cpp Message-ID: <200601191413.IAA06772@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64TargetMachine.cpp updated: 1.8 -> 1.9 --- Log message: click click --- Diffs of the changes: (+3 -5) IA64TargetMachine.cpp | 8 +++----- 1 files changed, 3 insertions(+), 5 deletions(-) Index: llvm/lib/Target/IA64/IA64TargetMachine.cpp diff -u llvm/lib/Target/IA64/IA64TargetMachine.cpp:1.8 llvm/lib/Target/IA64/IA64TargetMachine.cpp:1.9 --- llvm/lib/Target/IA64/IA64TargetMachine.cpp:1.8 Mon Nov 7 20:11:51 2005 +++ llvm/lib/Target/IA64/IA64TargetMachine.cpp Thu Jan 19 08:13:11 2006 @@ -103,11 +103,9 @@ PM.add(createUnreachableBlockEliminationPass()); // Add an instruction selector - if(EnableDAGIsel) - PM.add(createIA64DAGToDAGInstructionSelector(*this)); - else - PM.add(createIA64PatternInstructionSelector(*this)); - +// FIXME: reap this option one day: if(EnableDAGIsel) + PM.add(createIA64DAGToDAGInstructionSelector(*this)); + /* XXX not yet. ;) // Run optional SSA-based machine code optimizations next... if (!NoSSAPeephole) From llvm at cs.uiuc.edu Thu Jan 19 08:14:23 2006 From: llvm at cs.uiuc.edu (LLVM) Date: Thu, 19 Jan 2006 08:14:23 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelPattern.cpp Message-ID: <200601191414.IAA06788@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelPattern.cpp (r1.76) removed --- Log message: BOOM! --- Diffs of the changes: (+0 -0) 0 files changed From duraid at octopus.com.au Thu Jan 19 08:17:41 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 19 Jan 2006 08:17:41 -0600 Subject: [llvm-commits] CVS: llvm-test/Makefile.programs Message-ID: <200601191417.IAA06820@zion.cs.uiuc.edu> Changes in directory llvm-test: Makefile.programs updated: 1.184 -> 1.185 --- Log message: look at those cute little opcodes running around!! --- Diffs of the changes: (+1 -1) Makefile.programs | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/Makefile.programs diff -u llvm-test/Makefile.programs:1.184 llvm-test/Makefile.programs:1.185 --- llvm-test/Makefile.programs:1.184 Mon Jan 16 20:35:29 2006 +++ llvm-test/Makefile.programs Thu Jan 19 08:17:29 2006 @@ -194,7 +194,7 @@ # -enable-alpha-FTOI -enable-alpha-intfpdiv endif ifeq ($(ARCH),IA64) -LLCBETAOPTION := -enable-ia64-dag-isel +LLCBETAOPTION := -sched=simple endif ifeq ($(ARCH),x86) LLCBETAOPTION := -enable-x86-dag-isel From duraid at octopus.com.au Thu Jan 19 09:19:08 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 19 Jan 2006 09:19:08 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64InstrInfo.td Message-ID: <200601191519.JAA06989@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64InstrInfo.td updated: 1.39 -> 1.40 --- Log message: fix boolean XOR (which fixes up comparisons..) --- Diffs of the changes: (+4 -1) IA64InstrInfo.td | 5 ++++- 1 files changed, 4 insertions(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.39 llvm/lib/Target/IA64/IA64InstrInfo.td:1.40 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.39 Mon Jan 16 20:04:52 2006 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Thu Jan 19 09:18:56 2006 @@ -142,6 +142,9 @@ def TPCADDIMM22 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, s22imm:$imm, PR:$qp), "($qp) add $dst = $imm, $dst;;">; +def TPCADDS : AForm<0x03, 0x0b, + (ops GR:$dst, GR:$src1, s14imm:$imm, PR:$qp), + "($qp) adds $dst = $imm, $dst;;">; def TPCMPIMM8NE : AForm<0x03, 0x0b, (ops PR:$dst, PR:$src1, s22imm:$imm, GR:$src2, PR:$qp), "($qp) cmp.ne $dst , p0 = $imm, $src2;;">; @@ -377,7 +380,7 @@ def bXOR : Pat<(xor PR:$src1, PR:$src2), (TPCMPIMM8NE (PCMPEQUNCR0R0 PR:$src2), 1, - (PADDS r0, 1, PR:$src2), + (TPCADDS (ADDS r0, 0), 1, PR:$src2), PR:$src1)>; def XOR : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, GR:$src2), From alenhar2 at cs.uiuc.edu Thu Jan 19 14:49:58 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Thu, 19 Jan 2006 14:49:58 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaInstrInfo.td Message-ID: <200601192049.OAA19395@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaInstrInfo.td updated: 1.102 -> 1.103 --- Log message: nasty nasty patterns --- Diffs of the changes: (+8 -3) AlphaInstrInfo.td | 11 ++++++++--- 1 files changed, 8 insertions(+), 3 deletions(-) Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.102 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.103 --- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.102 Mon Jan 16 15:41:39 2006 +++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Thu Jan 19 14:49:37 2006 @@ -212,11 +212,16 @@ [(set GPRC:$RC, (xor GPRC:$RA, (not GPRC:$RB)))]>; def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC", [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>; -//def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", []>; //Extract byte low +def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", + [(set GPRC:$RC, (and (srl GPRC:$RA, (sll GPRC:$RB, 3)), 255))]>; +def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", + [(set GPRC:$RC, (and (srl GPRC:$RA, (sll GPRC:$RB, 3)), 65535))]>; +def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", + [(set GPRC:$RC, (and (srl GPRC:$RA, (sll GPRC:$RB, 3)), 4294967295))]>; + //def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low //def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high //def EXTLHi : OFormL<0x12, 0x6A, "EXTLH $RA,$L,$RC", []>; //Extract longword high -//def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", []>; //Extract longword low //def EXTLLi : OFormL<0x12, 0x26, "EXTLL $RA,$L,$RC", []>; //Extract longword low //def EXTQH : OForm< 0x12, 0x7A, "EXTQH $RA,$RB,$RC", []>; //Extract quadword high //def EXTQHi : OFormL<0x12, 0x7A, "EXTQH $RA,$L,$RC", []>; //Extract quadword high @@ -224,8 +229,8 @@ //def EXTQi : OFormL<0x12, 0x36, "EXTQ $RA,$L,$RC", []>; //Extract quadword low //def EXTWH : OForm< 0x12, 0x5A, "EXTWH $RA,$RB,$RC", []>; //Extract word high //def EXTWHi : OFormL<0x12, 0x5A, "EXTWH $RA,$L,$RC", []>; //Extract word high -//def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", []>; //Extract word low //def EXTWLi : OFormL<0x12, 0x16, "EXTWL $RA,$L,$RC", []>; //Extract word low + //def IMPLVER : OForm< 0x11, 0x6C, "IMPLVER $RA,$RB,$RC", []>; //Implementation version //def IMPLVERi : OFormL<0x11, 0x6C, "IMPLVER $RA,$L,$RC", []>; //Implementation version //def INSBL : OForm< 0x12, 0x0B, "INSBL $RA,$RB,$RC", []>; //Insert byte low From alenhar2 at cs.uiuc.edu Thu Jan 19 15:11:00 2006 From: alenhar2 at cs.uiuc.edu (Andrew Lenharth) Date: Thu, 19 Jan 2006 15:11:00 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/Alpha/AlphaISelLowering.cpp AlphaInstrInfo.td Message-ID: <200601192111.PAA29643@apoc.cs.uiuc.edu> Changes in directory llvm/lib/Target/Alpha: AlphaISelLowering.cpp updated: 1.23 -> 1.24 AlphaInstrInfo.td updated: 1.103 -> 1.104 --- Log message: typo --- Diffs of the changes: (+5 -4) AlphaISelLowering.cpp | 3 ++- AlphaInstrInfo.td | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) Index: llvm/lib/Target/Alpha/AlphaISelLowering.cpp diff -u llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.23 llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.24 --- llvm/lib/Target/Alpha/AlphaISelLowering.cpp:1.23 Mon Jan 16 15:22:38 2006 +++ llvm/lib/Target/Alpha/AlphaISelLowering.cpp Thu Jan 19 15:10:38 2006 @@ -97,9 +97,10 @@ // We don't support sin/cos/sqrt setOperationAction(ISD::FSIN , MVT::f64, Expand); setOperationAction(ISD::FCOS , MVT::f64, Expand); - setOperationAction(ISD::FSQRT, MVT::f64, Expand); setOperationAction(ISD::FSIN , MVT::f32, Expand); setOperationAction(ISD::FCOS , MVT::f32, Expand); + + setOperationAction(ISD::FSQRT, MVT::f64, Expand); setOperationAction(ISD::FSQRT, MVT::f32, Expand); setOperationAction(ISD::SETCC, MVT::f32, Promote); Index: llvm/lib/Target/Alpha/AlphaInstrInfo.td diff -u llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.103 llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.104 --- llvm/lib/Target/Alpha/AlphaInstrInfo.td:1.103 Thu Jan 19 14:49:37 2006 +++ llvm/lib/Target/Alpha/AlphaInstrInfo.td Thu Jan 19 15:10:38 2006 @@ -213,11 +213,11 @@ def EQVi : OFormL<0x11, 0x48, "eqv $RA,$L,$RC", [(set GPRC:$RC, (xor GPRC:$RA, immUExt8inv:$L))]>; def EXTBL : OForm< 0x12, 0x06, "EXTBL $RA,$RB,$RC", - [(set GPRC:$RC, (and (srl GPRC:$RA, (sll GPRC:$RB, 3)), 255))]>; + [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 255))]>; def EXTWL : OForm< 0x12, 0x16, "EXTWL $RA,$RB,$RC", - [(set GPRC:$RC, (and (srl GPRC:$RA, (sll GPRC:$RB, 3)), 65535))]>; + [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 65535))]>; def EXTLL : OForm< 0x12, 0x26, "EXTLL $RA,$RB,$RC", - [(set GPRC:$RC, (and (srl GPRC:$RA, (sll GPRC:$RB, 3)), 4294967295))]>; + [(set GPRC:$RC, (and (srl GPRC:$RA, (shl GPRC:$RB, 3)), 4294967295))]>; //def EXTBLi : OFormL<0x12, 0x06, "EXTBL $RA,$L,$RC", []>; //Extract byte low //def EXTLH : OForm< 0x12, 0x6A, "EXTLH $RA,$RB,$RC", []>; //Extract longword high From evan.cheng at apple.com Thu Jan 19 15:57:22 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 15:57:22 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200601192157.PAA09370@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.137 -> 1.138 --- Log message: Bug fix. Flag operand number may be calculated incorrectly. --- Diffs of the changes: (+13 -8) DAGISelEmitter.cpp | 21 +++++++++++++-------- 1 files changed, 13 insertions(+), 8 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.137 llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.137 Thu Jan 19 04:12:58 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Jan 19 15:57:10 2006 @@ -2119,12 +2119,22 @@ NodeHasProperty(Pattern, SDNodeInfo::SDNPInFlag, ISE); bool HasOutFlag = HasImpResults || (isRoot && PatternHasProperty(Pattern, SDNodeInfo::SDNPOutFlag, ISE)); + bool NodeHasChain = + NodeHasProperty(Pattern, SDNodeInfo::SDNPHasChain, ISE); bool HasChain = II.hasCtrlDep || (isRoot && PatternHasProperty(Pattern, SDNodeInfo::SDNPHasChain, ISE)); if (HasOutFlag || HasInFlag || HasOptInFlag || HasImpInputs) OS << " SDOperand InFlag = SDOperand(0, 0);\n"; + // How many results is this pattern expected to produce? + unsigned NumExpectedResults = 0; + for (unsigned i = 0, e = Pattern->getExtTypes().size(); i != e; i++) { + MVT::ValueType VT = Pattern->getTypeNum(i); + if (VT != MVT::isVoid && VT != MVT::Flag) + NumExpectedResults++; + } + // Determine operand emission order. Complex pattern first. std::vector > EmitOrder; std::vector >::iterator OI; @@ -2163,7 +2173,7 @@ if (HasImpInputs) EmitCopyToRegs(Pattern, "N", ChainEmitted, true); if (HasInFlag || HasOptInFlag) { - unsigned FlagNo = (unsigned) HasChain + Pattern->getNumChildren(); + unsigned FlagNo = (unsigned) NodeHasChain + Pattern->getNumChildren(); if (HasOptInFlag) OS << " if (N.getNumOperands() == " << FlagNo+1 << ") "; else @@ -2237,8 +2247,6 @@ } // User does not expect that the instruction produces a chain! - bool NodeHasChain = - NodeHasProperty(Pattern, SDNodeInfo::SDNPHasChain, ISE); bool AddedChain = HasChain && !NodeHasChain; if (NodeHasChain) OS << " CodeGenMap[N.getValue(" << ValNo++ << ")] = Chain;\n"; @@ -2255,13 +2263,10 @@ OS << " CodeGenMap[N.getValue(" << ValNo << ")] = InFlag;\n"; if (AddedChain && HasOutFlag) { - // Is this pattern expected to produce a result? - if (Pattern->getTypeNum(0) == MVT::isVoid || - Pattern->getTypeNum(0) == MVT::Flag) { + if (NumExpectedResults == 0) { OS << " return Result.getValue(N.ResNo+1);\n"; } else { - OS << " if (N.ResNo < " - << ((NumResults > 1) ? NumResults : 1) << ")\n"; + OS << " if (N.ResNo < " << NumExpectedResults << ")\n"; OS << " return Result.getValue(N.ResNo);\n"; OS << " else\n"; OS << " return Result.getValue(N.ResNo+1);\n"; From lattner at cs.uiuc.edu Thu Jan 19 16:02:02 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 16:02:02 -0600 Subject: [llvm-commits] CVS: llvm/utils/llvmdo Message-ID: <200601192202.QAA09451@zion.cs.uiuc.edu> Changes in directory llvm/utils: llvmdo updated: 1.9 -> 1.10 --- Log message: Don't include generated lexer .cpp files. --- Diffs of the changes: (+3 -0) llvmdo | 3 +++ 1 files changed, 3 insertions(+) Index: llvm/utils/llvmdo diff -u llvm/utils/llvmdo:1.9 llvm/utils/llvmdo:1.10 --- llvm/utils/llvmdo:1.9 Fri Oct 8 13:01:31 2004 +++ llvm/utils/llvmdo Thu Jan 19 16:01:51 2006 @@ -96,12 +96,15 @@ \! -name '*~' \ \! -name '#*' \ \! -name 'Sparc.burm.c' \ + \! -name 'Lexer.cpp' \ \! -name 'llvmAsmParser.cpp' \ \! -name 'llvmAsmParser.h' \ + \! -name 'FileLexer.cpp' \ \! -name 'FileParser.cpp' \ \! -name 'FileParser.h' \ \! -name 'StackerParser.h' \ \! -name 'StackerParser.cpp' \ + \! -name 'ConfigLexer.cpp' \ -exec $PROGRAM "$@" {} \; \ \) else From lattner at cs.uiuc.edu Thu Jan 19 17:16:10 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Thu, 19 Jan 2006 17:16:10 -0600 Subject: [llvm-commits] CVS: llvm/lib/Linker/LinkModules.cpp Message-ID: <200601192316.RAA09947@zion.cs.uiuc.edu> Changes in directory llvm/lib/Linker: LinkModules.cpp updated: 1.108 -> 1.109 --- Log message: add support for ConstantPacked to the linker --- Diffs of the changes: (+5 -0) LinkModules.cpp | 5 +++++ 1 files changed, 5 insertions(+) Index: llvm/lib/Linker/LinkModules.cpp diff -u llvm/lib/Linker/LinkModules.cpp:1.108 llvm/lib/Linker/LinkModules.cpp:1.109 --- llvm/lib/Linker/LinkModules.cpp:1.108 Tue Dec 6 11:30:58 2005 +++ llvm/lib/Linker/LinkModules.cpp Thu Jan 19 17:15:58 2006 @@ -290,6 +290,11 @@ Result = const_cast(CPV); } else if (isa(CPV)) { Result = cast(RemapOperand(CPV, ValueMap)); + } else if (const ConstantPacked *CP = dyn_cast(CPV)) { + std::vector Operands(CP->getNumOperands()); + for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) + Operands[i] = cast(RemapOperand(CP->getOperand(i), ValueMap)); + Result = ConstantPacked::get(Operands); } else if (const ConstantExpr *CE = dyn_cast(CPV)) { if (CE->getOpcode() == Instruction::GetElementPtr) { Value *Ptr = RemapOperand(CE->getOperand(0), ValueMap); From evan.cheng at apple.com Thu Jan 19 17:26:36 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 17:26:36 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td X86TargetMachine.cpp Message-ID: <200601192326.RAA10034@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.213 -> 1.214 X86TargetMachine.cpp updated: 1.92 -> 1.93 --- Log message: Added i16 SH{L|R}D patterns. --- Diffs of the changes: (+13 -3) X86InstrInfo.td | 14 ++++++++++++-- X86TargetMachine.cpp | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.213 llvm/lib/Target/X86/X86InstrInfo.td:1.214 --- llvm/lib/Target/X86/X86InstrInfo.td:1.213 Thu Jan 19 00:53:20 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Thu Jan 19 17:26:24 2006 @@ -3068,12 +3068,22 @@ def : Pat<(shl R16:$src1, (i8 1)), (ADD16rr R16:$src1, R16:$src1)>; def : Pat<(shl R32:$src1, (i8 1)), (ADD32rr R32:$src1, R32:$src1)>; -// (or (x >> c) | (y << (32 - c))) ==> (shrd x, y, c) +// (or (x >> c) | (y << (32 - c))) ==> (shrd32 x, y, c) def : Pat<(or (srl R32:$src1, CL:$amt), (shl R32:$src2, (sub 32, CL:$amt))), (SHRD32rrCL R32:$src1, R32:$src2)>; -// (or (x << c) | (y >> (32 - c))) ==> (shld x, y, c) +// (or (x << c) | (y >> (32 - c))) ==> (shld32 x, y, c) def : Pat<(or (shl R32:$src1, CL:$amt), (srl R32:$src2, (sub 32, CL:$amt))), (SHLD32rrCL R32:$src1, R32:$src2)>; + +// (or (x >> c) | (y << (16 - c))) ==> (shrd16 x, y, c) +def : Pat<(or (srl R16:$src1, CL:$amt), + (shl R16:$src2, (sub 16, CL:$amt))), + (SHRD16rrCL R16:$src1, R16:$src2)>; + +// (or (x << c) | (y >> (16 - c))) ==> (shld16 x, y, c) +def : Pat<(or (shl R16:$src1, CL:$amt), + (srl R16:$src2, (sub 16, CL:$amt))), + (SHLD16rrCL R16:$src1, R16:$src2)>; Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.92 llvm/lib/Target/X86/X86TargetMachine.cpp:1.93 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.92 Tue Dec 20 16:59:51 2005 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Thu Jan 19 17:26:24 2006 @@ -48,7 +48,7 @@ cl::opt EnableX86DAGDAG("enable-x86-dag-isel", cl::Hidden, cl::desc("Enable DAG-to-DAG isel for X86"), cl::location(X86DAGIsel), - cl::init(false)); + cl::init(true)); // FIXME: This should eventually be handled with target triples and // subtarget support! From evan.cheng at apple.com Thu Jan 19 17:27:20 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 17:27:20 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86TargetMachine.cpp Message-ID: <200601192327.RAA10052@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86TargetMachine.cpp updated: 1.93 -> 1.94 --- Log message: Didn't mean to commit the last one. --- Diffs of the changes: (+1 -1) X86TargetMachine.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.93 llvm/lib/Target/X86/X86TargetMachine.cpp:1.94 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.93 Thu Jan 19 17:26:24 2006 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Thu Jan 19 17:27:08 2006 @@ -48,7 +48,7 @@ cl::opt EnableX86DAGDAG("enable-x86-dag-isel", cl::Hidden, cl::desc("Enable DAG-to-DAG isel for X86"), cl::location(X86DAGIsel), - cl::init(true)); + cl::init(false)); // FIXME: This should eventually be handled with target triples and // subtarget support! From bocchino at persephone.cs.uiuc.edu Thu Jan 19 17:53:54 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Thu, 19 Jan 2006 17:53:54 -0600 (CST) Subject: [llvm-commits] CVS: llvm/lib/Transforms/Utils/Local.cpp Message-ID: <20060119235354.DF51A1D70353@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Transforms/Utils: Local.cpp updated: 1.51 -> 1.52 --- Log message: ConstantFoldLoadThroughGEPConstantExpr wasn't handling pointers to packed types correctly. --- Diffs of the changes: (+22 -9) Local.cpp | 31 ++++++++++++++++++++++--------- 1 files changed, 22 insertions(+), 9 deletions(-) Index: llvm/lib/Transforms/Utils/Local.cpp diff -u llvm/lib/Transforms/Utils/Local.cpp:1.51 llvm/lib/Transforms/Utils/Local.cpp:1.52 --- llvm/lib/Transforms/Utils/Local.cpp:1.51 Tue Jan 17 14:07:07 2006 +++ llvm/lib/Transforms/Utils/Local.cpp Thu Jan 19 17:53:23 2006 @@ -267,16 +267,29 @@ return 0; } } else if (ConstantInt *CI = dyn_cast(I.getOperand())) { - const ArrayType *ATy = cast(*I); - if ((uint64_t)CI->getRawValue() >= ATy->getNumElements()) return 0; - if (ConstantArray *CA = dyn_cast(C)) - C = CA->getOperand((unsigned)CI->getRawValue()); - else if (isa(C)) - C = Constant::getNullValue(ATy->getElementType()); - else if (isa(C)) - C = UndefValue::get(ATy->getElementType()); - else + if (const ArrayType *ATy = dyn_cast(*I)) { + if ((uint64_t)CI->getRawValue() >= ATy->getNumElements()) return 0; + if (ConstantArray *CA = dyn_cast(C)) + C = CA->getOperand((unsigned)CI->getRawValue()); + else if (isa(C)) + C = Constant::getNullValue(ATy->getElementType()); + else if (isa(C)) + C = UndefValue::get(ATy->getElementType()); + else + return 0; + } else if (const PackedType *PTy = dyn_cast(*I)) { + if ((uint64_t)CI->getRawValue() >= PTy->getNumElements()) return 0; + if (ConstantPacked *CP = dyn_cast(C)) + C = CP->getOperand((unsigned)CI->getRawValue()); + else if (isa(C)) + C = Constant::getNullValue(PTy->getElementType()); + else if (isa(C)) + C = UndefValue::get(PTy->getElementType()); + else + return 0; + } else { return 0; + } } else { return 0; } From evan.cheng at apple.com Thu Jan 19 19:11:15 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 19:11:15 -0600 Subject: [llvm-commits] CVS: llvm/utils/TableGen/DAGISelEmitter.cpp Message-ID: <200601200111.TAA10819@zion.cs.uiuc.edu> Changes in directory llvm/utils/TableGen: DAGISelEmitter.cpp updated: 1.138 -> 1.139 --- Log message: Prevent folding of a node with multiple uses if the node already folds a load! Here is an example where the load ended up being done twice: %A = global uint 0 uint %test(uint %B, ubyte %C) { %tmp = load uint *%A; %X = shl uint %tmp, ubyte %C %Cv = sub ubyte 32, %C %Y = shr uint %B, ubyte %Cv %Z = or uint %Y, %X store uint %Z, uint* %A ret uint %Z } ==> subl $4, %esp movl %ebx, (%esp) movl 8(%esp), %edx movl A, %eax movb 12(%esp), %bl movb %bl, %cl shldl %cl, %edx, %eax movb %bl, %cl shldl %cl, %edx, A movl (%esp), %ebx addl $4, %esp ret --- Diffs of the changes: (+9 -6) DAGISelEmitter.cpp | 15 +++++++++------ 1 files changed, 9 insertions(+), 6 deletions(-) Index: llvm/utils/TableGen/DAGISelEmitter.cpp diff -u llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 llvm/utils/TableGen/DAGISelEmitter.cpp:1.139 --- llvm/utils/TableGen/DAGISelEmitter.cpp:1.138 Thu Jan 19 15:57:10 2006 +++ llvm/utils/TableGen/DAGISelEmitter.cpp Thu Jan 19 19:11:03 2006 @@ -1907,18 +1907,21 @@ // Emit code to load the child nodes and match their contents recursively. unsigned OpNo = 0; - bool HasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE); + bool NodeHasChain = NodeHasProperty(N, SDNodeInfo::SDNPHasChain, ISE); + bool HasChain = PatternHasProperty(N, SDNodeInfo::SDNPHasChain, ISE); if (HasChain) { - OpNo = 1; + if (NodeHasChain) + OpNo = 1; if (!isRoot) { const SDNodeInfo &CInfo = ISE.getSDNodeInfo(N->getOperator()); OS << " if (!" << RootName << ".hasOneUse()) goto P" << PatternNo << "Fail; // Multiple uses of actual result?\n"; - OS << " if (CodeGenMap.count(" << RootName - << ".getValue(" << CInfo.getNumResults() << "))) goto P" - << PatternNo << "Fail; // Already selected for a chain use?\n"; + if (NodeHasChain) + OS << " if (CodeGenMap.count(" << RootName + << ".getValue(" << CInfo.getNumResults() << "))) goto P" + << PatternNo << "Fail; // Already selected for a chain use?\n"; } - if (!FoundChain) { + if (NodeHasChain && !FoundChain) { OS << " SDOperand Chain = " << RootName << ".getOperand(0);\n"; FoundChain = true; } From evan.cheng at apple.com Thu Jan 19 19:12:35 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 19:12:35 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/X86/2006-01-19-ISelFoldingBug.ll Message-ID: <200601200112.TAA10839@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/X86: 2006-01-19-ISelFoldingBug.ll added (r1.1) --- Log message: Added a load folding bug test case. --- Diffs of the changes: (+15 -0) 2006-01-19-ISelFoldingBug.ll | 15 +++++++++++++++ 1 files changed, 15 insertions(+) Index: llvm/test/Regression/CodeGen/X86/2006-01-19-ISelFoldingBug.ll diff -c /dev/null llvm/test/Regression/CodeGen/X86/2006-01-19-ISelFoldingBug.ll:1.1 *** /dev/null Thu Jan 19 19:12:33 2006 --- llvm/test/Regression/CodeGen/X86/2006-01-19-ISelFoldingBug.ll Thu Jan 19 19:12:23 2006 *************** *** 0 **** --- 1,15 ---- + ; RUN: llvm-as < %s | llc -march=x86 | grep 'shld' | wc -l | grep 1 + ; + ; Check that the isel does not fold the shld, which already folds a load + ; and has two uses, into a store. + %A = external global uint + + uint %test5(uint %B, ubyte %C) { + %tmp.1 = load uint *%A; + %tmp.2 = shl uint %tmp.1, ubyte %C + %tmp.3 = sub ubyte 32, %C + %tmp.4 = shr uint %B, ubyte %tmp.3 + %tmp.5 = or uint %tmp.4, %tmp.2 + store uint %tmp.5, uint* %A + ret uint %tmp.5 + } From evan.cheng at apple.com Thu Jan 19 19:13:42 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 19:13:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86InstrInfo.td X86TargetMachine.cpp Message-ID: <200601200113.TAA10875@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86InstrInfo.td updated: 1.214 -> 1.215 X86TargetMachine.cpp updated: 1.94 -> 1.95 --- Log message: A few more SH{L|R}D peepholes. --- Diffs of the changes: (+17 -1) X86InstrInfo.td | 16 ++++++++++++++++ X86TargetMachine.cpp | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.214 llvm/lib/Target/X86/X86InstrInfo.td:1.215 --- llvm/lib/Target/X86/X86InstrInfo.td:1.214 Thu Jan 19 17:26:24 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Thu Jan 19 19:13:30 2006 @@ -3073,17 +3073,33 @@ (shl R32:$src2, (sub 32, CL:$amt))), (SHRD32rrCL R32:$src1, R32:$src2)>; +def : Pat<(store (or (srl (loadi32 addr:$dst), CL:$amt), + (shl R32:$src2, (sub 32, CL:$amt))), addr:$dst), + (SHRD32mrCL addr:$dst, R32:$src2)>; + // (or (x << c) | (y >> (32 - c))) ==> (shld32 x, y, c) def : Pat<(or (shl R32:$src1, CL:$amt), (srl R32:$src2, (sub 32, CL:$amt))), (SHLD32rrCL R32:$src1, R32:$src2)>; +def : Pat<(store (or (shl (loadi32 addr:$dst), CL:$amt), + (srl R32:$src2, (sub 32, CL:$amt))), addr:$dst), + (SHLD32mrCL addr:$dst, R32:$src2)>; + // (or (x >> c) | (y << (16 - c))) ==> (shrd16 x, y, c) def : Pat<(or (srl R16:$src1, CL:$amt), (shl R16:$src2, (sub 16, CL:$amt))), (SHRD16rrCL R16:$src1, R16:$src2)>; +def : Pat<(store (or (srl (loadi16 addr:$dst), CL:$amt), + (shl R16:$src2, (sub 16, CL:$amt))), addr:$dst), + (SHRD16mrCL addr:$dst, R16:$src2)>; + // (or (x << c) | (y >> (16 - c))) ==> (shld16 x, y, c) def : Pat<(or (shl R16:$src1, CL:$amt), (srl R16:$src2, (sub 16, CL:$amt))), (SHLD16rrCL R16:$src1, R16:$src2)>; + +def : Pat<(store (or (shl (loadi16 addr:$dst), CL:$amt), + (srl R16:$src2, (sub 16, CL:$amt))), addr:$dst), + (SHLD16mrCL addr:$dst, R16:$src2)>; Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.94 llvm/lib/Target/X86/X86TargetMachine.cpp:1.95 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.94 Thu Jan 19 17:27:08 2006 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Thu Jan 19 19:13:30 2006 @@ -48,7 +48,7 @@ cl::opt EnableX86DAGDAG("enable-x86-dag-isel", cl::Hidden, cl::desc("Enable DAG-to-DAG isel for X86"), cl::location(X86DAGIsel), - cl::init(false)); + cl::init(true)); // FIXME: This should eventually be handled with target triples and // subtarget support! From evan.cheng at apple.com Thu Jan 19 19:14:17 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Thu, 19 Jan 2006 19:14:17 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86TargetMachine.cpp Message-ID: <200601200114.TAA10893@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86TargetMachine.cpp updated: 1.95 -> 1.96 --- Log message: Stop doing that accidental commit. --- Diffs of the changes: (+1 -1) X86TargetMachine.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/X86/X86TargetMachine.cpp diff -u llvm/lib/Target/X86/X86TargetMachine.cpp:1.95 llvm/lib/Target/X86/X86TargetMachine.cpp:1.96 --- llvm/lib/Target/X86/X86TargetMachine.cpp:1.95 Thu Jan 19 19:13:30 2006 +++ llvm/lib/Target/X86/X86TargetMachine.cpp Thu Jan 19 19:14:05 2006 @@ -48,7 +48,7 @@ cl::opt EnableX86DAGDAG("enable-x86-dag-isel", cl::Hidden, cl::desc("Enable DAG-to-DAG isel for X86"), cl::location(X86DAGIsel), - cl::init(true)); + cl::init(false)); // FIXME: This should eventually be handled with target triples and // subtarget support! From reid at x10sys.com Thu Jan 19 19:32:09 2006 From: reid at x10sys.com (Reid Spencer) Date: Thu, 19 Jan 2006 19:32:09 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/Linker/2006-01-19-ConstantPacked.ll Message-ID: <200601200132.TAA10994@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/Linker: 2006-01-19-ConstantPacked.ll added (r1.1) --- Log message: Add a test case for PR697: http://llvm.cs.uiuc.edu/PR697 , ensuring the linker works with ConstantPacked. --- Diffs of the changes: (+14 -0) 2006-01-19-ConstantPacked.ll | 14 ++++++++++++++ 1 files changed, 14 insertions(+) Index: llvm/test/Regression/Linker/2006-01-19-ConstantPacked.ll diff -c /dev/null llvm/test/Regression/Linker/2006-01-19-ConstantPacked.ll:1.1 *** /dev/null Thu Jan 19 19:32:08 2006 --- llvm/test/Regression/Linker/2006-01-19-ConstantPacked.ll Thu Jan 19 19:31:58 2006 *************** *** 0 **** --- 1,14 ---- + ; RUN: llvm-as %s -f -o %s.bc ; llvm-link -f -o %s.linked %s.bc + + target endian = big + target pointersize = 32 + target triple = "powerpc-apple-darwin7.7.0" + deplibs = [ "c", "crtend" ] + %source = global <4 x int> < int 0, int 1, int 2, int 3 > + + implementation ; Functions: + + int %main() { + entry: + ret int 0 + } From duraid at octopus.com.au Thu Jan 19 21:40:37 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Thu, 19 Jan 2006 21:40:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp IA64InstrInfo.td Message-ID: <200601200340.VAA11876@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.25 -> 1.26 IA64InstrInfo.td updated: 1.40 -> 1.41 --- Log message: fix storing bools! eek! --- Diffs of the changes: (+5 -8) IA64ISelDAGToDAG.cpp | 4 ++-- IA64InstrInfo.td | 9 +++------ 2 files changed, 5 insertions(+), 8 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.25 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.26 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.25 Mon Jan 16 21:09:48 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Thu Jan 19 21:40:25 2006 @@ -542,9 +542,9 @@ // first load zero! SDOperand Initial = CurDAG->getCopyFromReg(Chain, IA64::r0, MVT::i64); Chain = Initial.getValue(1); - // then load 1 iff the predicate to store is 1 + // then load 1 into the same reg iff the predicate to store is 1 SDOperand Tmp = - CurDAG->getTargetNode(IA64::PADDS, MVT::i64, Initial, + CurDAG->getTargetNode(IA64::TPCADDS, MVT::i64, Initial, CurDAG->getConstant(1, MVT::i64), Select(N->getOperand(1))); return CurDAG->SelectNodeTo(N, Opc, MVT::Other, Address, Tmp, Chain); Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.40 llvm/lib/Target/IA64/IA64InstrInfo.td:1.41 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.40 Thu Jan 19 09:18:56 2006 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Thu Jan 19 21:40:25 2006 @@ -113,10 +113,6 @@ "adds $dst = $imm, $src1;;", [(set GR:$dst, (add GR:$src1, immSExt14:$imm))]>; -def PADDS: AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, s14imm:$imm, PR:$qp), - "($qp) adds $dst = $imm, $src1;;", - []>; - def MOVL : AForm_DAG<0x03, 0x0b, (ops GR:$dst, s64imm:$imm), "movl $dst = $imm;;", [(set GR:$dst, imm64:$imm)]>; @@ -142,9 +138,10 @@ def TPCADDIMM22 : AForm<0x03, 0x0b, (ops GR:$dst, GR:$src1, s22imm:$imm, PR:$qp), "($qp) add $dst = $imm, $dst;;">; -def TPCADDS : AForm<0x03, 0x0b, +def TPCADDS : AForm_DAG<0x03, 0x0b, (ops GR:$dst, GR:$src1, s14imm:$imm, PR:$qp), - "($qp) adds $dst = $imm, $dst;;">; + "($qp) adds $dst = $imm, $dst;;", + []>; def TPCMPIMM8NE : AForm<0x03, 0x0b, (ops PR:$dst, PR:$src1, s22imm:$imm, GR:$src2, PR:$qp), "($qp) cmp.ne $dst , p0 = $imm, $src2;;">; From jeffc at jolt-lang.org Thu Jan 19 22:34:58 2006 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Thu, 19 Jan 2006 22:34:58 -0600 Subject: [llvm-commits] CVS: llvm/win32/Configure/Configure.vcproj Message-ID: <200601200434.WAA12178@zion.cs.uiuc.edu> Changes in directory llvm/win32/Configure: Configure.vcproj updated: 1.10 -> 1.11 --- Log message: Update Windows version of config.h to note availability of floor/floorf/ceil/ceilf. Also pulled Windows-specific modifications to config.h.in to a separate file, so that changes to it trigger regeneration of config.h (which doesn't happen when the custom build step for it changes). --- Diffs of the changes: (+10 -22) Configure.vcproj | 32 ++++++++++---------------------- 1 files changed, 10 insertions(+), 22 deletions(-) Index: llvm/win32/Configure/Configure.vcproj diff -u llvm/win32/Configure/Configure.vcproj:1.10 llvm/win32/Configure/Configure.vcproj:1.11 --- llvm/win32/Configure/Configure.vcproj:1.10 Wed Oct 26 20:10:37 2005 +++ llvm/win32/Configure/Configure.vcproj Thu Jan 19 22:34:45 2006 @@ -74,24 +74,8 @@ @@ -102,7 +86,8 @@ @@ -113,7 +98,8 @@ @@ -124,7 +110,8 @@ @@ -135,7 +122,8 @@ From jeffc at jolt-lang.org Thu Jan 19 22:34:58 2006 From: jeffc at jolt-lang.org (Jeff Cohen) Date: Thu, 19 Jan 2006 22:34:58 -0600 Subject: [llvm-commits] CVS: llvm/win32/config.h Message-ID: <200601200434.WAA12182@zion.cs.uiuc.edu> Changes in directory llvm/win32: config.h added (r1.1) --- Log message: Update Windows version of config.h to note availability of floor/floorf/ceil/ceilf. Also pulled Windows-specific modifications to config.h.in to a separate file, so that changes to it trigger regeneration of config.h (which doesn't happen when the custom build step for it changes). --- Diffs of the changes: (+24 -0) config.h | 24 ++++++++++++++++++++++++ 1 files changed, 24 insertions(+) Index: llvm/win32/config.h diff -c /dev/null llvm/win32/config.h:1.1 *** /dev/null Thu Jan 19 22:34:55 2006 --- llvm/win32/config.h Thu Jan 19 22:34:45 2006 *************** *** 0 **** --- 1,24 ---- + /* This file is appended to config.h.in to form the Windows version of + * config.h */ + + #define PACKAGE_NAME "LLVM (win32 vc7.1)" + #define PACKAGE_VERSION 1.4 + #define HAVE_WINDOWS_H 1 + #define HAVE_LIMITS_H 1 + #define HAVE_SYS_STAT_H 1 + #define HAVE_STDLIB_H 1 + #define HAVE_STDIO_H 1 + #define HAVE_STRING_H 1 + #define SHLIBEXT ".lib" + #define error_t int + #define HAVE_ERRNO_H 1 + #define LTDL_DLOPEN_DEPLIBS 1 + #define HAVE_CEIL 1 + #define HAVE_CEILF 1 + #define HAVE_FLOOR 1 + #define HAVE_FLOORF 1 + #define LTDL_OBJDIR "_libs" + #define LTDL_SHLIBPATH_VAR "PATH" + #define LTDL_SHLIB_EXT ".dll" + #define LTDL_SYSSEARCHPATH "" + #define LLVM_ON_WIN32 1 From duraid at octopus.com.au Fri Jan 20 10:10:26 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Fri, 20 Jan 2006 10:10:26 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp IA64ISelLowering.cpp Message-ID: <200601201610.KAA24890@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.26 -> 1.27 IA64ISelLowering.cpp updated: 1.23 -> 1.24 --- Log message: fix sext breakage: now we correctly deal with functions that return int vs uint --- Diffs of the changes: (+5 -1) IA64ISelDAGToDAG.cpp | 2 +- IA64ISelLowering.cpp | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.26 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.27 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.26 Thu Jan 19 21:40:25 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Fri Jan 20 10:10:05 2006 @@ -494,7 +494,7 @@ */ case ISD::LOAD: - case ISD::EXTLOAD: + case ISD::EXTLOAD: // FIXME: load -1, not 1, for bools? case ISD::ZEXTLOAD: { SDOperand Chain = Select(N->getOperand(0)); SDOperand Address = Select(N->getOperand(1)); Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.23 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.24 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.23 Thu Jan 19 02:31:51 2006 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Fri Jan 20 10:10:05 2006 @@ -475,6 +475,8 @@ switch (RetTyVT) { default: assert(0 && "Unknown value type to return!"); case MVT::i1: { // bools are just like other integers (returned in r8) + // we *could* fall through to the truncate below, but this saves a + // few redundant predicate ops SDOperand boolInR8 = DAG.getCopyFromReg(Chain, IA64::r8, MVT::i64, InFlag); InFlag = boolInR8.getValue(2); Chain = boolInR8.getValue(1); @@ -492,8 +494,10 @@ Chain = RetVal.getValue(1); // keep track of whether it is sign or zero extended (todo: bools?) +/* XXX RetVal = DAG.getNode(RetTy->isSigned() ? ISD::AssertSext :ISD::AssertZext, MVT::i64, RetVal, DAG.getValueType(RetTyVT)); +*/ RetVal = DAG.getNode(ISD::TRUNCATE, RetTyVT, RetVal); break; case MVT::i64: From lattner at cs.uiuc.edu Fri Jan 20 12:01:53 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 12:01:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp Message-ID: <200601201801.MAA25551@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AutoUpgrade.cpp updated: 1.4 -> 1.5 --- Log message: Don't use invalidated use_iterator's. This fixes a crash compiling povray --- Diffs of the changes: (+2 -2) AutoUpgrade.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/VMCore/AutoUpgrade.cpp diff -u llvm/lib/VMCore/AutoUpgrade.cpp:1.4 llvm/lib/VMCore/AutoUpgrade.cpp:1.5 --- llvm/lib/VMCore/AutoUpgrade.cpp:1.4 Thu Jan 19 01:00:29 2006 +++ llvm/lib/VMCore/AutoUpgrade.cpp Fri Jan 20 12:01:41 2006 @@ -166,8 +166,8 @@ bool llvm::UpgradeCallsToIntrinsic(Function* F) { if (Function* newF = UpgradeIntrinsicFunction(F)) { for (Value::use_iterator UI = F->use_begin(), UE = F->use_end(); - UI != UE; ++UI) { - if (CallInst* CI = dyn_cast(*UI)) { + UI != UE; UI) { + if (CallInst* CI = dyn_cast(*UI++)) { std::vector Oprnds; User::op_iterator OI = CI->op_begin(); ++OI; From lattner at cs.uiuc.edu Fri Jan 20 12:04:55 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 12:04:55 -0600 Subject: [llvm-commits] CVS: llvm/lib/VMCore/AutoUpgrade.cpp Message-ID: <200601201804.MAA25598@zion.cs.uiuc.edu> Changes in directory llvm/lib/VMCore: AutoUpgrade.cpp updated: 1.5 -> 1.6 --- Log message: Remove dead expression. --- Diffs of the changes: (+1 -1) AutoUpgrade.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/VMCore/AutoUpgrade.cpp diff -u llvm/lib/VMCore/AutoUpgrade.cpp:1.5 llvm/lib/VMCore/AutoUpgrade.cpp:1.6 --- llvm/lib/VMCore/AutoUpgrade.cpp:1.5 Fri Jan 20 12:01:41 2006 +++ llvm/lib/VMCore/AutoUpgrade.cpp Fri Jan 20 12:04:43 2006 @@ -166,7 +166,7 @@ bool llvm::UpgradeCallsToIntrinsic(Function* F) { if (Function* newF = UpgradeIntrinsicFunction(F)) { for (Value::use_iterator UI = F->use_begin(), UE = F->use_end(); - UI != UE; UI) { + UI != UE; ) { if (CallInst* CI = dyn_cast(*UI++)) { std::vector Oprnds; User::op_iterator OI = CI->op_begin(); From bocchino at persephone.cs.uiuc.edu Fri Jan 20 12:19:10 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Fri, 20 Jan 2006 12:19:10 -0600 (CST) Subject: [llvm-commits] CVS: llvm/lib/ExecutionEngine/ExecutionEngine.cpp Message-ID: <20060120181910.A7BF81D7F7BC@persephone.cs.uiuc.edu> Changes in directory llvm/lib/ExecutionEngine: ExecutionEngine.cpp updated: 1.72 -> 1.73 --- Log message: Fixed InitializeMemory to handle ConstantPacked. --- Diffs of the changes: (+6 -0) ExecutionEngine.cpp | 6 ++++++ 1 files changed, 6 insertions(+) Index: llvm/lib/ExecutionEngine/ExecutionEngine.cpp diff -u llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.72 llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.73 --- llvm/lib/ExecutionEngine/ExecutionEngine.cpp:1.72 Sun Oct 23 18:54:56 2005 +++ llvm/lib/ExecutionEngine/ExecutionEngine.cpp Fri Jan 20 12:18:40 2006 @@ -457,6 +457,12 @@ void ExecutionEngine::InitializeMemory(const Constant *Init, void *Addr) { if (isa(Init)) { return; + } else if (const ConstantPacked *CP = dyn_cast(Init)) { + unsigned ElementSize = + getTargetData().getTypeSize(CP->getType()->getElementType()); + for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) + InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize); + return; } else if (Init->getType()->isFirstClassType()) { GenericValue Val = getConstantValue(Init); StoreValueToMemory(Val, (GenericValue*)Addr, Init->getType()); From lattner at cs.uiuc.edu Fri Jan 20 12:38:44 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 12:38:44 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp SelectionDAGISel.cpp Message-ID: <200601201838.MAA25812@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.271 -> 1.272 SelectionDAGISel.cpp updated: 1.128 -> 1.129 --- Log message: If the target doesn't support f32 natively, insert the FP_EXTEND in target-indep code, so that the LowerReturn code doesn't have to handle it. --- Diffs of the changes: (+7 -2) LegalizeDAG.cpp | 5 +++-- SelectionDAGISel.cpp | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.271 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.272 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.271 Wed Jan 18 22:54:52 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Jan 20 12:38:32 2006 @@ -3377,7 +3377,8 @@ /// Found. static void FindLatestCallSeqStart(SDNode *Node, SDNode *&Found, std::set &Visited) { - if (Node->getNodeDepth() <= Found->getNodeDepth() || + if (/*Node->getNodeDepth() <= Found->getNodeDepth() ||*/ + Node->getNumOperands() == 0 || !Visited.insert(Node).second) return; // If we found an CALLSEQ_START, we already know this node occurs later @@ -3404,7 +3405,7 @@ /// than Found. static void FindEarliestCallSeqEnd(SDNode *Node, SDNode *&Found, std::set &Visited) { - if ((Found && Node->getNodeDepth() >= Found->getNodeDepth()) || + if (/*(Found && Node->getNodeDepth() >= Found->getNodeDepth()) ||*/ !Visited.insert(Node).second) return; // If we found an CALLSEQ_END, we already know this node occurs earlier Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.128 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.129 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.128 Wed Jan 18 15:50:14 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jan 20 12:38:32 2006 @@ -490,6 +490,10 @@ Op1 = DAG.getNode(ISD::ZERO_EXTEND, TmpVT, Op1); break; case MVT::f32: + // If this is a machine where f32 is promoted to f64, do so now. + if (TLI.getTypeAction(MVT::f32) == TargetLowering::Promote) + Op1 = DAG.getNode(ISD::FP_EXTEND, TLI.getTypeToTransformTo(MVT::f32),Op1); + break; case MVT::i64: case MVT::f64: break; // No extension needed! From lattner at cs.uiuc.edu Fri Jan 20 12:40:21 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 12:40:21 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601201840.MAA25888@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.272 -> 1.273 --- Log message: remove some unintentionally committed code --- Diffs of the changes: (+2 -3) LegalizeDAG.cpp | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.272 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.273 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.272 Fri Jan 20 12:38:32 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Jan 20 12:40:10 2006 @@ -3377,8 +3377,7 @@ /// Found. static void FindLatestCallSeqStart(SDNode *Node, SDNode *&Found, std::set &Visited) { - if (/*Node->getNodeDepth() <= Found->getNodeDepth() ||*/ - Node->getNumOperands() == 0 || + if (Node->getNodeDepth() <= Found->getNodeDepth() || !Visited.insert(Node).second) return; // If we found an CALLSEQ_START, we already know this node occurs later @@ -3405,7 +3404,7 @@ /// than Found. static void FindEarliestCallSeqEnd(SDNode *Node, SDNode *&Found, std::set &Visited) { - if (/*(Found && Node->getNodeDepth() >= Found->getNodeDepth()) ||*/ + if ((Found && Node->getNodeDepth() >= Found->getNodeDepth()) || !Visited.insert(Node).second) return; // If we found an CALLSEQ_END, we already know this node occurs earlier From lattner at cs.uiuc.edu Fri Jan 20 12:41:37 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 12:41:37 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86ISelLowering.cpp Message-ID: <200601201841.MAA25966@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86ISelLowering.cpp updated: 1.51 -> 1.52 --- Log message: LowerReturn now doesn't have to handle f32 returns. --- Diffs of the changes: (+0 -2) X86ISelLowering.cpp | 2 -- 1 files changed, 2 deletions(-) Index: llvm/lib/Target/X86/X86ISelLowering.cpp diff -u llvm/lib/Target/X86/X86ISelLowering.cpp:1.51 llvm/lib/Target/X86/X86ISelLowering.cpp:1.52 --- llvm/lib/Target/X86/X86ISelLowering.cpp:1.51 Thu Jan 19 02:52:46 2006 +++ llvm/lib/Target/X86/X86ISelLowering.cpp Fri Jan 20 12:41:25 2006 @@ -283,8 +283,6 @@ case MVT::f32: case MVT::f64: if (!X86ScalarSSE) { - if (OpVT == MVT::f32) - Op = DAG.getNode(ISD::FP_EXTEND, MVT::f64, Op); std::vector Tys; Tys.push_back(MVT::Other); Tys.push_back(MVT::Flag); From lattner at cs.uiuc.edu Fri Jan 20 12:57:15 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 12:57:15 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/CBackend/Writer.cpp Message-ID: <200601201857.MAA26109@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/CBackend: Writer.cpp updated: 1.250 -> 1.251 --- Log message: Simplify CWriter::printContainedStructs, also allowing it to work with PackedTypes as a side-effect. --- Diffs of the changes: (+11 -18) Writer.cpp | 29 +++++++++++------------------ 1 files changed, 11 insertions(+), 18 deletions(-) Index: llvm/lib/Target/CBackend/Writer.cpp diff -u llvm/lib/Target/CBackend/Writer.cpp:1.250 llvm/lib/Target/CBackend/Writer.cpp:1.251 --- llvm/lib/Target/CBackend/Writer.cpp:1.250 Tue Dec 27 04:40:34 2005 +++ llvm/lib/Target/CBackend/Writer.cpp Fri Jan 20 12:57:03 2006 @@ -1037,29 +1037,22 @@ // this one depends on. void CWriter::printContainedStructs(const Type *Ty, std::set &StructPrinted){ + // Don't walk through pointers. + if (isa(Ty) || Ty->isPrimitiveType()) return; + + // Print all contained types first. + for (Type::subtype_iterator I = Ty->subtype_begin(), + E = Ty->subtype_end(); I != E; ++I) + printContainedStructs(*I, StructPrinted); + if (const StructType *STy = dyn_cast(Ty)) { - //Check to see if we have already printed this struct - if (StructPrinted.count(STy) == 0) { - // Print all contained types first... - for (StructType::element_iterator I = STy->element_begin(), - E = STy->element_end(); I != E; ++I) { - const Type *Ty1 = I->get(); - if (isa(Ty1) || isa(Ty1)) - printContainedStructs(*I, StructPrinted); - } - - //Print structure type out.. - StructPrinted.insert(STy); + // Check to see if we have already printed this struct. + if (StructPrinted.insert(STy).second) { + // Print structure type out. std::string Name = TypeNames[STy]; printType(Out, STy, Name, true); Out << ";\n\n"; } - - // If it is an array, check contained types and continue - } else if (const ArrayType *ATy = dyn_cast(Ty)){ - const Type *Ty1 = ATy->getElementType(); - if (isa(Ty1) || isa(Ty1)) - printContainedStructs(Ty1, StructPrinted); } } From duraid at octopus.com.au Fri Jan 20 14:24:42 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Fri, 20 Jan 2006 14:24:42 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp IA64ISelLowering.cpp IA64ISelLowering.h IA64InstrInfo.td Message-ID: <200601202024.OAA01561@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.27 -> 1.28 IA64ISelLowering.cpp updated: 1.24 -> 1.25 IA64ISelLowering.h updated: 1.4 -> 1.5 IA64InstrInfo.td updated: 1.41 -> 1.42 --- Log message: remove RET hack, add proper support for rets (watching out for ret voids) --- Diffs of the changes: (+89 -56) IA64ISelDAGToDAG.cpp | 51 --------------------------------------- IA64ISelLowering.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ IA64ISelLowering.h | 16 ++++++++++-- IA64InstrInfo.td | 12 ++++++--- 4 files changed, 89 insertions(+), 56 deletions(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.27 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.28 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.27 Fri Jan 20 10:10:05 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Fri Jan 20 14:24:31 2006 @@ -585,57 +585,6 @@ getI64Imm(Amt), Select(N->getOperand(0))); } - case ISD::RET: { - SDOperand Chain = Select(N->getOperand(0)); // Token chain. - SDOperand InFlag; - - switch (N->getNumOperands()) { - default: - assert(0 && "Unknown return instruction!"); - case 2: { - SDOperand RetVal = Select(N->getOperand(1)); - switch (RetVal.getValueType()) { - default: assert(0 && "I don't know how to return this type! (promote?)"); - // FIXME: do I need to add support for bools here? - // (return '0' or '1' in r8, basically...) - // - // FIXME: need to round floats - 80 bits is bad, the tester - // told me so - case MVT::i64: - // we mark r8 as live on exit up above in LowerArguments() - // BuildMI(BB, IA64::MOV, 1, IA64::r8).addReg(Tmp1); - Chain = CurDAG->getCopyToReg(Chain, IA64::r8, RetVal); - InFlag = Chain.getValue(1); - break; - case MVT::f64: - // we mark F8 as live on exit up above in LowerArguments() - // BuildMI(BB, IA64::FMOV, 1, IA64::F8).addReg(Tmp1); - Chain = CurDAG->getCopyToReg(Chain, IA64::F8, RetVal); - InFlag = Chain.getValue(1); - break; - } - break; - } - case 1: - break; - } - - // we need to copy VirtGPR (the vreg (to become a real reg)) that holds - // the output of this function's alloc instruction back into ar.pfs - // before we return. this copy must not float up above the last - // outgoing call in this function!!! - SDOperand AR_PFSVal = CurDAG->getCopyFromReg(Chain, IA64Lowering.VirtGPR, - MVT::i64); - Chain = AR_PFSVal.getValue(1); - Chain = CurDAG->getCopyToReg(Chain, IA64::AR_PFS, AR_PFSVal); - - // and then just emit a 'ret' instruction - // before returning, restore the ar.pfs register (set by the 'alloc' up top) - // BuildMI(BB, IA64::MOV, 1).addReg(IA64::AR_PFS).addReg(IA64Lowering.VirtGPR); - // - return CurDAG->SelectNodeTo(N, IA64::RET, MVT::Other, Chain); - } - case ISD::BR: // FIXME: we don't need long branches all the time! return CurDAG->SelectNodeTo(N, IA64::BRL_NOTCALL, MVT::Other, Index: llvm/lib/Target/IA64/IA64ISelLowering.cpp diff -u llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.24 llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.25 --- llvm/lib/Target/IA64/IA64ISelLowering.cpp:1.24 Fri Jan 20 10:10:05 2006 +++ llvm/lib/Target/IA64/IA64ISelLowering.cpp Fri Jan 20 14:24:31 2006 @@ -39,6 +39,11 @@ setOperationAction(ISD::BRTWOWAY_CC , MVT::Other, Expand); setOperationAction(ISD::FP_ROUND_INREG , MVT::f32 , Expand); + // We need to handle ISD::RET for void functions ourselves, + // so we get a chance to restore ar.pfs before adding a + // br.ret insn + setOperationAction(ISD::RET, MVT::Other, Custom); + setSetCCResultType(MVT::i1); setShiftAmountType(MVT::i64); @@ -101,6 +106,7 @@ default: return 0; case IA64ISD::GETFD: return "IA64ISD::GETFD"; case IA64ISD::BRCALL: return "IA64ISD::BRCALL"; + case IA64ISD::RET_FLAG: return "IA64ISD::RET_FLAG"; } } @@ -524,6 +530,44 @@ return std::make_pair(RetVal, Chain); } +SDOperand IA64TargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op, + SelectionDAG &DAG) { + SDOperand Copy, InFlag; + SDOperand AR_PFSVal = DAG.getCopyFromReg(Chain, this->VirtGPR, + MVT::i64); + Chain = AR_PFSVal.getValue(1); + + switch (Op.getValueType()) { + default: assert(0 && "Unknown type to return! (promote?)"); + case MVT::i64: + Copy = DAG.getCopyToReg(Chain, IA64::r8, Op, InFlag); + break; + case MVT::f64: + Copy = DAG.getCopyToReg(Chain, IA64::F8, Op, InFlag); + break; + } + + Chain = Copy.getValue(0); + InFlag = Copy.getValue(1); + // we need to copy VirtGPR (the vreg (to become a real reg)) that holds + // the output of this function's alloc instruction back into ar.pfs + // before we return. this copy must not float up above the last + // outgoing call in this function - we flag this to the ret instruction + Chain = DAG.getCopyToReg(Chain, IA64::AR_PFS, AR_PFSVal, InFlag); + InFlag = Chain.getValue(1); + + // and then just emit a 'ret' instruction + std::vector NodeTys; + std::vector RetOperands; + NodeTys.push_back(MVT::Other); + NodeTys.push_back(MVT::Flag); + RetOperands.push_back(Chain); + RetOperands.push_back(InFlag); + + return DAG.getNode(IA64ISD::RET_FLAG, NodeTys, RetOperands); +// return DAG.getNode(IA64ISD::RET_FLAG, MVT::Other, MVT::Other, Copy, Chain, InFlag); +} + SDOperand IA64TargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, SelectionDAG &DAG) { @@ -566,3 +610,25 @@ abort(); } +SDOperand IA64TargetLowering:: +LowerOperation(SDOperand Op, SelectionDAG &DAG) { + switch (Op.getOpcode()) { + default: assert(0 && "Should not custom lower this!"); + case ISD::RET: { // the DAGgy stuff takes care of + // restoring ar.pfs before adding a br.ret for functions + // that return something, but we need to take care of stuff + // that returns void manually, so here it is: + assert(Op.getNumOperands()==1 && + "trying to custom lower a return other than void! (numops!=1)"); + + SDOperand Chain = Op.getOperand(0); + SDOperand AR_PFSVal = DAG.getCopyFromReg(Chain, this->VirtGPR, + MVT::i64); + Chain = AR_PFSVal.getValue(1); + Chain = DAG.getCopyToReg(Chain, IA64::AR_PFS, AR_PFSVal); + + // and then just emit a 'ret' instruction + return DAG.getNode(IA64ISD::RET_FLAG, MVT::Other, Chain); + } + } +} Index: llvm/lib/Target/IA64/IA64ISelLowering.h diff -u llvm/lib/Target/IA64/IA64ISelLowering.h:1.4 llvm/lib/Target/IA64/IA64ISelLowering.h:1.5 --- llvm/lib/Target/IA64/IA64ISelLowering.h:1.4 Sat Jan 14 16:27:21 2006 +++ llvm/lib/Target/IA64/IA64ISelLowering.h Fri Jan 20 14:24:31 2006 @@ -30,7 +30,10 @@ GETFD, // TODO: explain this hack - BRCALL + BRCALL, + + // RET_FLAG - Return with a flag operand + RET_FLAG }; } @@ -64,9 +67,18 @@ bool isTailCall, SDOperand Callee, ArgListTy &Args, SelectionDAG &DAG); + /// LowerReturnTo - This spits out restore-previous-frame-state+br.ret + /// instructions + virtual SDOperand LowerReturnTo(SDOperand Chain, SDOperand Op, + SelectionDAG &DAG); + + /// LowerOperation - for custom lowering specific ops + /// (currently, only "ret void") + virtual SDOperand LowerOperation(SDOperand Op, SelectionDAG &DAG); + virtual SDOperand LowerVAStart(SDOperand Chain, SDOperand VAListP, Value *VAListV, SelectionDAG &DAG); - + virtual std::pair LowerVAArg(SDOperand Chain, SDOperand VAListP, Value *VAListV, const Type *ArgTy, SelectionDAG &DAG); Index: llvm/lib/Target/IA64/IA64InstrInfo.td diff -u llvm/lib/Target/IA64/IA64InstrInfo.td:1.41 llvm/lib/Target/IA64/IA64InstrInfo.td:1.42 --- llvm/lib/Target/IA64/IA64InstrInfo.td:1.41 Thu Jan 19 21:40:25 2006 +++ llvm/lib/Target/IA64/IA64InstrInfo.td Fri Jan 20 14:24:31 2006 @@ -21,6 +21,10 @@ def IA64getfd : SDNode<"IA64ISD::GETFD", SDTFPToIntOp, []>; +def SDT_IA64RetFlag : SDTypeProfile<0, 0, []>; +def retflag : SDNode<"IA64ISD::RET_FLAG", SDT_IA64RetFlag, + [SDNPHasChain, SDNPOptInFlag]>; + //===--------- def u2imm : Operand; @@ -717,7 +721,9 @@ "($qp) br.cond.call.sptk $dst;;">; } +// Return branch: let isTerminator = 1, isReturn = 1, noResults = 1 in - def RET : RawForm<0x03, 0xb0, (ops), "br.ret.sptk.many rp;;">; // return - - + def RET : AForm_DAG<0x03, 0x0b, (ops), + "br.ret.sptk.many rp;;", + [(retflag)]>; // return +def : Pat<(ret), (RET)>; From jlaskey at apple.com Fri Jan 20 14:34:18 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 14:34:18 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601202034.OAA01628@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.11 -> 1.12 --- Log message: Reworked how Dwarf debug info entries and abbreviations are handled. Added pubnames and debuy str sections. --- Diffs of the changes: (+235 -90) DwarfWriter.h | 325 +++++++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 235 insertions(+), 90 deletions(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.11 llvm/include/llvm/CodeGen/DwarfWriter.h:1.12 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.11 Wed Jan 18 10:54:26 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Fri Jan 20 14:34:06 2006 @@ -438,6 +438,15 @@ }; //===--------------------------------------------------------------------===// + // Forward declarations. + // + class AsmPrinter; + class DIE; + class DwarfWriter; + class DWContext; + class MachineDebugInfo; + + //===--------------------------------------------------------------------===// // DWLabel - Labels are used to track locations in the assembler file. // Labels appear in the form debug_, where the tag is a // category of label (Ex. location) and number is a value unique in that @@ -445,57 +454,89 @@ struct DWLabel { const char *Tag; // Label category tag. Should always be // a staticly declared C string. - unsigned Number; // Unique number + unsigned Number; // Unique number. - DWLabel() : Tag(NULL), Number(0) {} DWLabel(const char *T, unsigned N) : Tag(T), Number(N) {} }; - + + //===--------------------------------------------------------------------===// + // DIEAbbrevData - Dwarf abbreviation data, describes the one attribute of a + // Dwarf abbreviation. + class DIEAbbrevData { + private: + unsigned Attribute; // Dwarf attribute code. + unsigned Form; // Dwarf form code. + + public: + DIEAbbrevData(unsigned A, unsigned F) + : Attribute(A) + , Form(F) + {} + + // Accessors + unsigned getAttribute() const { return Attribute; } + unsigned getForm() const { return Form; } + }; + //===--------------------------------------------------------------------===// // DIEAbbrev - Dwarf abbreviation, describes the organization of a debug // information object. - // class DIEAbbrev { private: - const unsigned char *Data; // Static array of bytes containing the - // image of the raw abbreviation data. + unsigned Tag; // Dwarf tag code. + unsigned ChildrenFlag; // Dwarf children flag. + std::vector Data; // Raw data bytes for abbreviation. public: - DIEAbbrev(const unsigned char *D) - : Data(D) + DIEAbbrev(unsigned T, unsigned C) + : Tag(T) + , ChildrenFlag(C) + , Data() {} + ~DIEAbbrev() {} + // Accessors + unsigned getTag() const { return Tag; } + unsigned getChildrenFlag() const { return ChildrenFlag; } + const std::vector &getData() const { return Data; } + /// operator== - Used by UniqueVector to locate entry. /// - bool operator==(const DIEAbbrev &DA) const { - return Data == DA.Data; - } + bool operator==(const DIEAbbrev &DA) const; /// operator< - Used by UniqueVector to locate entry. /// - bool operator<(const DIEAbbrev &DA) const { - return Data < DA.Data; - } + bool operator<(const DIEAbbrev &DA) const; - // Accessors - unsigned getTag() const { return Data[0]; } - unsigned getChildrenFlag() const { return Data[1]; } - unsigned getAttribute(unsigned i) const { return Data[2 + 2 * i + 0]; } - unsigned getForm(unsigned i) const { return Data[2 + 2 * i + 1]; } + /// AddAttribute - Adds another set of attribute information to the + /// abbreviation. + void AddAttribute(unsigned Attribute, unsigned Form) { + Data.push_back(DIEAbbrevData(Attribute, Form)); + } + + /// Emit - Print the abbreviation using the specified Dwarf writer. + /// + void Emit(const DwarfWriter &DW) const; + +#ifndef NDEBUG + void print(std::ostream &O); + void dump(); +#endif }; //===--------------------------------------------------------------------===// // DIEValue - A debug information entry value. // - class DwarfWriter; class DIEValue { public: enum { isInteger, isString, isLabel, - isDelta + isAsIsLabel, + isDelta, + isEntry }; unsigned Type; // Type of the value @@ -520,14 +561,14 @@ // class DIEInteger : public DIEValue { private: - int Value; + int Integer; public: - DIEInteger(int V) : DIEValue(isInteger), Value(V) {} + DIEInteger(int I) : DIEValue(isInteger), Integer(I) {} // Implement isa/cast/dyncast. static bool classof(const DIEInteger *) { return true; } - static bool classof(const DIEValue *V) { return V->Type == isInteger; } + static bool classof(const DIEValue *I) { return I->Type == isInteger; } /// EmitValue - Emit integer of appropriate size. /// @@ -542,13 +583,13 @@ // DIEString - A string value DIE. // struct DIEString : public DIEValue { - const std::string Value; + const std::string String; - DIEString(const std::string &V) : DIEValue(isString), Value(V) {} + DIEString(const std::string &S) : DIEValue(isString), String(S) {} // Implement isa/cast/dyncast. static bool classof(const DIEString *) { return true; } - static bool classof(const DIEValue *V) { return V->Type == isString; } + static bool classof(const DIEValue *S) { return S->Type == isString; } /// EmitValue - Emit string value. /// @@ -563,13 +604,35 @@ // DIELabel - A simple label expression DIE. // struct DIELabel : public DIEValue { - const DWLabel Value; + const DWLabel Label; + + DIELabel(const DWLabel &L) : DIEValue(isLabel), Label(L) {} + + // Implement isa/cast/dyncast. + static bool classof(const DIELabel *) { return true; } + static bool classof(const DIEValue *L) { return L->Type == isLabel; } + + /// EmitValue - Emit label value. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const; + + /// SizeOf - Determine size of label value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const; + }; + + + //===--------------------------------------------------------------------===// + // DIEAsIsLabel - An exact name of a label. + // + struct DIEAsIsLabel : public DIEValue { + const std::string Label; - DIELabel(const DWLabel &V) : DIEValue(isLabel), Value(V) {} + DIEAsIsLabel(const std::string &L) : DIEValue(isAsIsLabel), Label(L) {} // Implement isa/cast/dyncast. - static bool classof(const DWLabel *) { return true; } - static bool classof(const DIEValue *V) { return V->Type == isLabel; } + static bool classof(const DIEAsIsLabel *) { return true; } + static bool classof(const DIEValue *L) { return L->Type == isAsIsLabel; } /// EmitValue - Emit label value. /// @@ -584,15 +647,36 @@ // DIEDelta - A simple label difference DIE. // struct DIEDelta : public DIEValue { - const DWLabel Value1; - const DWLabel Value2; + const DWLabel LabelHi; + const DWLabel LabelLo; - DIEDelta(const DWLabel &V1, const DWLabel &V2) - : DIEValue(isDelta), Value1(V1), Value2(V2) {} + DIEDelta(const DWLabel &Hi, const DWLabel &Lo) + : DIEValue(isDelta), LabelHi(Hi), LabelLo(Lo) {} // Implement isa/cast/dyncast. static bool classof(const DIEDelta *) { return true; } - static bool classof(const DIEValue *V) { return V->Type == isDelta; } + static bool classof(const DIEValue *D) { return D->Type == isDelta; } + + /// EmitValue - Emit delta value. + /// + virtual void EmitValue(const DwarfWriter &DW, unsigned Form) const; + + /// SizeOf - Determine size of delta value in bytes. + /// + virtual unsigned SizeOf(const DwarfWriter &DW, unsigned Form) const; + }; + + //===--------------------------------------------------------------------===// + // DIEntry - A pointer to a debug information entry. + // + struct DIEntry : public DIEValue { + DIE *Entry; + + DIEntry(DIE *E) : DIEValue(isEntry), Entry(E) {} + + // Implement isa/cast/dyncast. + static bool classof(const DIEntry *) { return true; } + static bool classof(const DIEValue *E) { return E->Type == isEntry; } /// EmitValue - Emit delta value. /// @@ -608,70 +692,106 @@ // describes it's organization. class DIE { private: + DIEAbbrev *Abbrev; // Temporary buffer for abbreviation. unsigned AbbrevID; // Decribing abbreviation ID. - unsigned Offset; // Offset in debug info section - unsigned Size; // Size of instance + children - std::vector Children; // Children DIEs - std::vector Values; // Attributes values + unsigned Offset; // Offset in debug info section. + unsigned Size; // Size of instance + children. + DWContext *Context; // Context for types and values. + std::vector Children; // Children DIEs. + std::vector Values; // Attributes values. public: - DIE(unsigned AbbrevID) - : AbbrevID(AbbrevID) - , Offset(0) - , Size(0) - , Children() - , Values() - {} - ~DIE() { - for (unsigned i = 0, N = Children.size(); i < N; i++) { - delete Children[i]; - } - - for (unsigned j = 0, M = Children.size(); j < M; j++) { - delete Children[j]; - } - } + DIE(unsigned Tag, unsigned ChildrenFlag); + ~DIE(); // Accessors - unsigned getAbbrevID() const { return AbbrevID; } - unsigned getOffset() const { return Offset; } - unsigned getSize() const { return Size; } + unsigned getAbbrevID() const { return AbbrevID; } + unsigned getOffset() const { return Offset; } + unsigned getSize() const { return Size; } + DWContext *getContext() const { return Context; } const std::vector &getChildren() const { return Children; } const std::vector &getValues() const { return Values; } void setOffset(unsigned O) { Offset = O; } void setSize(unsigned S) { Size = S; } - - /// AddValue - Add an attribute value of appropriate type. - /// - void AddValue(int Value) { - Values.push_back(new DIEInteger(Value)); - } - void AddValue(const std::string &Value) { - Values.push_back(new DIEString(Value)); - } - void AddValue(const DWLabel &Value) { - Values.push_back(new DIELabel(Value)); - } - void AddValue(const DWLabel &Value1, const DWLabel &Value2) { - Values.push_back(new DIEDelta(Value1, Value2)); - } + void setContext(DWContext *C) { Context = C; } /// SiblingOffset - Return the offset of the debug information entry's /// sibling. unsigned SiblingOffset() const { return Offset + Size; } - }; - //===--------------------------------------------------------------------===// - // Forward declarations. - // - class AsmPrinter; - class MachineDebugInfo; + /// AddInt - Add a simple integer attribute data and value. + /// + void AddInt(unsigned Attribute, unsigned Form, int Integer); + + /// AddString - Add a std::string attribute data and value. + /// + void AddString(unsigned Attribute, unsigned Form, + const std::string &String); + + /// AddLabel - Add a Dwarf label attribute data and value. + /// + void AddLabel(unsigned Attribute, unsigned Form, const DWLabel &Label); + + /// AddAsIsLabel - Add a non-Dwarf label attribute data and value. + /// + void AddAsIsLabel(unsigned Attribute, unsigned Form, + const std::string &Label); + + /// AddDelta - Add a label delta attribute data and value. + /// + void AddDelta(unsigned Attribute, unsigned Form, + const DWLabel &Hi, const DWLabel &Lo); + + /// AddDIEntry - Add a DIE attribute data and value. + /// + void AddDIEntry(unsigned Attribute, unsigned Form, DIE *Entry); + + /// Complete - Indicate that all attributes have been added and + /// ready to get an abbreviation ID. + /// + void Complete(DwarfWriter &DW); + + /// AddChild - Add a child to the DIE. + void AddChild(DIE *Child); + }; //===--------------------------------------------------------------------===// - // DwarfWriter - emits Dwarf debug and exception handling directives. + /// DWContext - Name context for types and values. + /// + class DWContext { + private: + DwarfWriter &DW; // DwarfWriter for global information. + DIE *Owner; // Owning debug information entry. + std::map Types; // Named types in context. + std::map Variables;// Named variables in context. + + public: + DWContext(DwarfWriter &D, DIE *O) + : DW(D) + , Owner(O) + , Types() + , Variables() + { + Owner->setContext(this); + } + ~DWContext() {} + + /// NewBasicType - Creates a new basic type, if necessary, then adds in the + /// context and owner. + DIE *NewBasicType(const std::string &Name, unsigned Size, + unsigned Encoding); + + /// NewVariable - Creates a basic variable, if necessary, then adds in the + /// context and owner. + DIE *NewVariable(const std::string &Name, + unsigned SourceFileID, unsigned Line, + DIE *Type, bool IsExternal); + }; + + //===--------------------------------------------------------------------===// + // DwarfWriter - Emits Dwarf debug and exception handling directives. // class DwarfWriter { - protected: //===------------------------------------------------------------------===// @@ -707,6 +827,18 @@ /// UniqueVector Abbreviations; + /// GlobalTypes - A map of globally visible named types. + /// + std::map GlobalTypes; + + /// GlobalEntities - A map of globally visible named entities. + /// + std::map GlobalEntities; + + /// StringPool - A UniqueVector of strings used by indirect references. + /// + UniqueVector StringPool; + //===------------------------------------------------------------------===// // Properties to be set by the derived class ctor, used to configure the // Dwarf writer. @@ -861,21 +993,34 @@ EmitReference(Label.Tag, Label.Number); } void EmitReference(const char *Tag, unsigned Number) const; + void EmitReference(const std::string Name) const; /// EmitDifference - Emit the difference between two labels. Some /// assemblers do not behave with absolute expressions with data directives, /// so there is an option (needsSet) to use an intermediary set expression. - void EmitDifference(DWLabel Label1, DWLabel Label2) const { - EmitDifference(Label1.Tag, Label1.Number, Label2.Tag, Label2.Number); + void EmitDifference(DWLabel LabelHi, DWLabel LabelLo) const { + EmitDifference(LabelHi.Tag, LabelHi.Number, LabelLo.Tag, LabelLo.Number); } - void EmitDifference(const char *Tag1, unsigned Number1, - const char *Tag2, unsigned Number2) const; + void EmitDifference(const char *TagHi, unsigned NumberHi, + const char *TagLo, unsigned NumberLo) const; -private: - /// NewDIE - Construct a new structured debug information entry. + /// NewAbbreviation - Add the abbreviation to the Abbreviation vector. /// - DIE *NewDIE(const unsigned char *AbbrevData); + unsigned NewAbbreviation(DIEAbbrev *Abbrev); + + /// NewString - Add a string to the constant pool and returns a label. + /// + DWLabel NewString(const std::string &String); + + /// NewGlobalType - Make the type visible globally using the given name. + /// + void NewGlobalType(const std::string &Name, DIE *Type); + + /// NewGlobalEntity - Make the entity visible globally using the given name. + /// + void NewGlobalEntity(const std::string &Name, DIE *Entity); +private: /// NewCompileUnit - Create new compile unit information. /// DIE *NewCompileUnit(const std::string &Directory, @@ -956,7 +1101,7 @@ void SetDebugInfo(MachineDebugInfo *di) { DebugInfo = di; } //===------------------------------------------------------------------===// - // Main enties. + // Main entry points. // /// BeginModule - Emit all Dwarf sections that should come prior to the From jlaskey at apple.com Fri Jan 20 14:34:19 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 14:34:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200601202034.OAA01632@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.8 -> 1.9 --- Log message: Reworked how Dwarf debug info entries and abbreviations are handled. Added pubnames and debuy str sections. --- Diffs of the changes: (+425 -161) DwarfWriter.cpp | 586 ++++++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 425 insertions(+), 161 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.8 llvm/lib/CodeGen/DwarfWriter.cpp:1.9 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.8 Wed Jan 18 10:54:26 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Fri Jan 20 14:34:06 2006 @@ -27,84 +27,6 @@ cl::desc("Add comments to Dwarf directives.")); //===----------------------------------------------------------------------===// -// Dwarf abbreviations used by this emitter. -// - -static const unsigned char AbbrevTAG_compile_unit[] = { - DW_TAG_compile_unit, DW_CHILDREN_yes, - DW_AT_stmt_list, DW_FORM_data4, - DW_AT_high_pc, DW_FORM_addr, - DW_AT_low_pc, DW_FORM_addr, - DW_AT_producer, DW_FORM_string, - DW_AT_language, DW_FORM_data1, - DW_AT_name, DW_FORM_string, - DW_AT_comp_dir, DW_FORM_string, - 0, 0 -}; - -static const unsigned char AbbrevTAG_subprogram[] = { - DW_TAG_subprogram, DW_CHILDREN_yes, - DW_AT_sibling, DW_FORM_ref4, - DW_AT_external, DW_FORM_flag, - DW_AT_name, DW_FORM_string, - DW_AT_decl_file, DW_FORM_data1, - DW_AT_decl_line, DW_FORM_data1, - DW_AT_prototyped, DW_FORM_flag, - DW_AT_type, DW_FORM_ref4, - DW_AT_low_pc, DW_FORM_addr, - DW_AT_high_pc, DW_FORM_addr, - DW_AT_frame_base, DW_FORM_block1, - 0, 0 -}; - -static const unsigned char AbbrevTAG_formal_parameter[] = { - DW_TAG_formal_parameter, DW_CHILDREN_no, - DW_AT_name, DW_FORM_string, - DW_AT_decl_file, DW_FORM_data1, - DW_AT_decl_line, DW_FORM_data1, - DW_AT_type, DW_FORM_ref4, - DW_AT_location, DW_FORM_block1, - 0, 0 -}; - -static const unsigned char AbbrevTAG_base_type[] = { - DW_TAG_base_type, DW_CHILDREN_no, - DW_AT_name, DW_FORM_string, - DW_AT_byte_size, DW_FORM_data1, - DW_AT_encoding, DW_FORM_data1, - 0, 0 -}; - -static const unsigned char AbbrevTAG_pointer_type[] = { - DW_TAG_pointer_type, DW_CHILDREN_no, - DW_AT_byte_size, DW_FORM_data1, - DW_AT_type, DW_FORM_ref4, - 0, 0 -}; - -static const unsigned char AbbrevTAG_array_type[] = { - DW_TAG_array_type, DW_CHILDREN_yes, - DW_AT_sibling, DW_FORM_ref4, - DW_AT_type, DW_FORM_ref4, - 0, 0 -}; - -static const unsigned char AbbrevTAG_subrange_type[] = { - DW_TAG_subrange_type, DW_CHILDREN_no, - 0, 0 -}; - -static const unsigned char AbbrevTAG_variable[] = { - DW_TAG_variable, DW_CHILDREN_no, - DW_AT_name, DW_FORM_string, - DW_AT_type, DW_FORM_ref4, - DW_AT_external, DW_FORM_flag, - DW_AT_artificial, DW_FORM_flag, - DW_AT_declaration, DW_FORM_flag, - 0, 0 -}; - -//===----------------------------------------------------------------------===// /// TagString - Return the string for the specified tag. /// @@ -659,13 +581,102 @@ //===----------------------------------------------------------------------===// +/// operator== - Used by UniqueVector to locate entry. +/// +bool DIEAbbrev::operator==(const DIEAbbrev &DA) const { + if (Tag != DA.Tag) return false; + if (ChildrenFlag != DA.ChildrenFlag) return false; + if (Data.size() != DA.Data.size()) return false; + + for (unsigned i = 0, N = Data.size(); i < N; i++) { + const DIEAbbrevData &AttrData = Data[i]; + const DIEAbbrevData &DAAttrData = Data[i]; + if (AttrData.getAttribute() != DAAttrData.getAttribute()) return false; + if (AttrData.getForm() != DAAttrData.getForm()) return false; + } + + return true; +} + +/// operator< - Used by UniqueVector to locate entry. +/// +bool DIEAbbrev::operator<(const DIEAbbrev &DA) const { + if (Tag != DA.Tag) return Tag < DA.Tag; + if (ChildrenFlag != DA.ChildrenFlag) return ChildrenFlag < DA.ChildrenFlag; + if (Data.size() != DA.Data.size()) return Data.size() < DA.Data.size(); + + for (unsigned i = 0, N = Data.size(); i < N; i++) { + const DIEAbbrevData &AttrData = Data[i]; + const DIEAbbrevData &DAAttrData = DA.Data[i]; + if (AttrData.getAttribute() != DAAttrData.getAttribute()) + return AttrData.getAttribute() < DAAttrData.getAttribute(); + if (AttrData.getForm() != DAAttrData.getForm()) + return AttrData.getForm() < DAAttrData.getForm(); + } + + return false; +} + +/// Emit - Print the abbreviation using the specified Dwarf writer. +/// +void DIEAbbrev::Emit(const DwarfWriter &DW) const { + // Emit its Dwarf tag type. + DW.EmitULEB128Bytes(Tag); + DW.EOL(TagString(Tag)); + + // Emit whether it has children DIEs. + DW.EmitULEB128Bytes(ChildrenFlag); + DW.EOL(ChildrenString(ChildrenFlag)); + + // For each attribute description. + for (unsigned i = 0, N = Data.size(); i < N; i++) { + const DIEAbbrevData &AttrData = Data[i]; + + // Emit attribute type. + DW.EmitULEB128Bytes(AttrData.getAttribute()); + DW.EOL(AttributeString(AttrData.getAttribute())); + + // Emit form type. + DW.EmitULEB128Bytes(AttrData.getForm()); + DW.EOL(FormEncodingString(AttrData.getForm())); + } + + // Mark end of abbreviation. + DW.EmitULEB128Bytes(0); DW.EOL("EOM(1)"); + DW.EmitULEB128Bytes(0); DW.EOL("EOM(2)"); +} + +#ifndef NDEBUG + void DIEAbbrev::print(std::ostream &O) { + O << "Abbreviation @" + << std::hex << (unsigned)this << std::dec + << " " + << TagString(Tag) + << " " + << ChildrenString(ChildrenFlag) + << "\n"; + + for (unsigned i = 0, N = Data.size(); i < N; i++) { + O << " " + << AttributeString(Data[i].getAttribute()) + << " " + << FormEncodingString(Data[i].getForm()) + << "\n"; + } + } + void DIEAbbrev::dump() { print(std::cerr); } +#endif + +//===----------------------------------------------------------------------===// + /// EmitValue - Emit integer of appropriate size. /// void DIEInteger::EmitValue(const DwarfWriter &DW, unsigned Form) const { switch (Form) { - case DW_FORM_data1: DW.EmitByte(Value); break; - case DW_FORM_data2: DW.EmitShort(Value); break; - case DW_FORM_data4: DW.EmitLong(Value); break; + case DW_FORM_data1: // Fall thru + case DW_FORM_flag: DW.EmitByte(Integer); break; + case DW_FORM_data2: DW.EmitShort(Integer); break; + case DW_FORM_data4: DW.EmitLong(Integer); break; default: assert(0 && "DIE Value form not supported yet"); break; } } @@ -674,6 +685,7 @@ /// unsigned DIEInteger::SizeOf(const DwarfWriter &DW, unsigned Form) const { switch (Form) { + case DW_FORM_flag: // Fall thru case DW_FORM_data1: return sizeof(int8_t); case DW_FORM_data2: return sizeof(int16_t); case DW_FORM_data4: return sizeof(int32_t); @@ -687,13 +699,13 @@ /// EmitValue - Emit string value. /// void DIEString::EmitValue(const DwarfWriter &DW, unsigned Form) const { - DW.EmitString(Value); + DW.EmitString(String); } /// SizeOf - Determine size of string value in bytes. /// unsigned DIEString::SizeOf(const DwarfWriter &DW, unsigned Form) const { - return Value.size() + sizeof(int8_t); + return String.size() + sizeof('\0'); } //===----------------------------------------------------------------------===// @@ -701,7 +713,7 @@ /// EmitValue - Emit label value. /// void DIELabel::EmitValue(const DwarfWriter &DW, unsigned Form) const { - DW.EmitReference(Value); + DW.EmitReference(Label); } /// SizeOf - Determine size of label value in bytes. @@ -712,10 +724,24 @@ //===----------------------------------------------------------------------===// +/// EmitValue - Emit label value. +/// +void DIEAsIsLabel::EmitValue(const DwarfWriter &DW, unsigned Form) const { + DW.EmitReference(Label); +} + +/// SizeOf - Determine size of label value in bytes. +/// +unsigned DIEAsIsLabel::SizeOf(const DwarfWriter &DW, unsigned Form) const { + return DW.getAddressSize(); +} + +//===----------------------------------------------------------------------===// + /// EmitValue - Emit delta value. /// void DIEDelta::EmitValue(const DwarfWriter &DW, unsigned Form) const { - DW.EmitDifference(Value1, Value2); + DW.EmitDifference(LabelHi, LabelLo); } /// SizeOf - Determine size of delta value in bytes. @@ -725,6 +751,171 @@ } //===----------------------------------------------------------------------===// +/// EmitValue - Emit extry offset. +/// +void DIEntry::EmitValue(const DwarfWriter &DW, unsigned Form) const { + DW.EmitLong(Entry->getOffset()); +} + +/// SizeOf - Determine size of label value in bytes. +/// +unsigned DIEntry::SizeOf(const DwarfWriter &DW, unsigned Form) const { + return sizeof(int32_t); +} + +//===----------------------------------------------------------------------===// + +DIE::DIE(unsigned Tag, unsigned ChildrenFlag) +: Abbrev(new DIEAbbrev(Tag, ChildrenFlag)) +, AbbrevID(0) +, Offset(0) +, Size(0) +, Context(NULL) +, Children() +, Values() +{} + +DIE::~DIE() { + if (Abbrev) delete Abbrev; + + for (unsigned i = 0, N = Children.size(); i < N; i++) { + delete Children[i]; + } + + for (unsigned j = 0, M = Values.size(); j < M; j++) { + delete Values[j]; + } + + if (Context) delete Context; +} + +/// AddInt - Add a simple integer attribute data and value. +/// +void DIE::AddInt(unsigned Attribute, unsigned Form, + int Integer) { + Abbrev->AddAttribute(Attribute, Form); + Values.push_back(new DIEInteger(Integer)); +} + +/// AddString - Add a std::string attribute data and value. +/// +void DIE::AddString(unsigned Attribute, unsigned Form, + const std::string &String) { + Abbrev->AddAttribute(Attribute, Form); + Values.push_back(new DIEString(String)); +} + +/// AddLabel - Add a Dwarf label attribute data and value. +/// +void DIE::AddLabel(unsigned Attribute, unsigned Form, + const DWLabel &Label) { + Abbrev->AddAttribute(Attribute, Form); + Values.push_back(new DIELabel(Label)); +} + +/// AddAsIsLabel - Add an non-Dwarf label attribute data and value. +/// +void DIE::AddAsIsLabel(unsigned Attribute, unsigned Form, + const std::string &Label) { + Abbrev->AddAttribute(Attribute, Form); + Values.push_back(new DIEAsIsLabel(Label)); +} + +/// AddDelta - Add a label delta attribute data and value. +/// +void DIE::AddDelta(unsigned Attribute, unsigned Form, + const DWLabel &Hi, const DWLabel &Lo) { + Abbrev->AddAttribute(Attribute, Form); + Values.push_back(new DIEDelta(Hi, Lo)); +} + +/// AddDIEntry - Add a DIE attribute data and value. +/// +void DIE::AddDIEntry(unsigned Attribute, + unsigned Form, DIE *Entry) { + Abbrev->AddAttribute(Attribute, Form); + Values.push_back(new DIEntry(Entry)); +} + +/// Complete - Indicate that all attributes have been added and ready to get an +/// abbreviation ID. +void DIE::Complete(DwarfWriter &DW) { + AbbrevID = DW.NewAbbreviation(Abbrev); + delete Abbrev; + Abbrev = NULL; +} + +/// AddChild - Add a child to the DIE. +/// +void DIE::AddChild(DIE *Child) { + Children.push_back(Child); +} + +//===----------------------------------------------------------------------===// + +/// NewBasicType - Creates a new basic type if necessary, then adds in the +/// context and owner. +DIE *DWContext::NewBasicType(const std::string &Name, unsigned Size, + unsigned Encoding) { + // FIXME - Just a prototype. + DIE *Type = Types[Name]; + + // If first occurance of type. + if (!Type) { + // construct the type DIE. + Type = new DIE(DW_TAG_base_type, DW_CHILDREN_no); + Type->AddString(DW_AT_name, DW_FORM_string, Name); + Type->AddInt (DW_AT_byte_size, DW_FORM_data1, Size); + Type->AddInt (DW_AT_encoding, DW_FORM_data1, Encoding); + Type->Complete(DW); + + // Add to context owner. + Owner->AddChild(Type); + + // Add to map. + Types[Name] = Type; + } + + return Type; +} + +/// NewVariable - Creates a basic variable, if necessary, then adds in the +/// context and owner. +DIE *DWContext::NewVariable(const std::string &Name, + unsigned SourceFileID, unsigned Line, + DIE *Type, bool IsExternal) { + // FIXME - Just a prototype. + DIE *Variable = Variables[Name]; + + // If first occurance of variable. + if (!Variable) { + assert(IsExternal && "Internal variables not handled yet"); + Variable = new DIE(DW_TAG_variable, DW_CHILDREN_no); + Variable->AddString (DW_AT_name, DW_FORM_string, Name); + Variable->AddInt (DW_AT_decl_file, DW_FORM_data1, SourceFileID); + Variable->AddInt (DW_AT_decl_line, DW_FORM_data1, Line); + Variable->AddDIEntry (DW_AT_type, DW_FORM_ref4, Type); + Variable->AddInt (DW_AT_external, DW_FORM_flag, (int)IsExternal); + Variable->AddAsIsLabel(DW_AT_location, DW_FORM_block1, + std::string("_")+Name+".b"); + Variable->Complete(DW); + + // Add to context owner. + Owner->AddChild(Variable); + + // Add to map. + Variables[Name] = Variable; + + // If external add to visible names. + if (IsExternal) { + DW.NewGlobalEntity(Name, Variable); + } + } + + return Variable; +} + +//===----------------------------------------------------------------------===// /// PrintHex - Print a value as a hexidecimal value. /// @@ -903,20 +1094,29 @@ PrintLabelName(Tag, Number); } +void DwarfWriter::EmitReference(const std::string Name) const { + if (AddressSize == 4) + O << Asm->Data32bitsDirective; + else + O << Asm->Data64bitsDirective; + + O << Name; +} /// EmitDifference - Emit an label difference as sizeof(pointer) value. Some /// assemblers do not accept absolute expressions with data directives, so there /// is an option (needsSet) to use an intermediary 'set' expression. -void DwarfWriter::EmitDifference(const char *Tag1, unsigned Number1, - const char *Tag2, unsigned Number2) const { +void DwarfWriter::EmitDifference(const char *TagHi, unsigned NumberHi, + const char *TagLo, unsigned NumberLo) const { if (needsSet) { static unsigned SetCounter = 0; + O << "\t.set\t"; PrintLabelName("set", SetCounter); O << ","; - PrintLabelName(Tag1, Number1); + PrintLabelName(TagHi, NumberHi); O << "-"; - PrintLabelName(Tag2, Number2); + PrintLabelName(TagLo, NumberLo); O << "\n"; if (AddressSize == sizeof(int32_t)) @@ -933,40 +1133,58 @@ else O << Asm->Data64bitsDirective; - PrintLabelName(Tag1, Number1); + PrintLabelName(TagHi, NumberHi); O << "-"; - PrintLabelName(Tag2, Number2); + PrintLabelName(TagLo, NumberLo); } } -/// NewDIE - Construct a new structured debug information entry. +/// NewAbbreviation - Add the abbreviation to the Abbreviation vector. /// -DIE *DwarfWriter::NewDIE(const unsigned char *AbbrevData) { - // Get the abbreviation ID. - unsigned AbbrevID = Abbreviations.insert(DIEAbbrev(AbbrevData)); - // Allocate new new structured DIE. - DIE *Die = new DIE(AbbrevID); - // Return structured DIE. - return Die; +unsigned DwarfWriter::NewAbbreviation(DIEAbbrev *Abbrev) { + return Abbreviations.insert(*Abbrev); +} + +/// NewString - Add a string to the constant pool and returns a label. +/// +DWLabel DwarfWriter::NewString(const std::string &String) { + unsigned StringID = StringPool.insert(String); + return DWLabel("string", StringID); +} + +/// NewGlobalType - Make the type visible globally using the given name. +/// +void DwarfWriter::NewGlobalType(const std::string &Name, DIE *Type) { + // FIXME - check for duplication. + GlobalTypes[Name] = Type; +} + +/// NewGlobalEntity - Make the entity visible globally using the given name. +/// +void DwarfWriter::NewGlobalEntity(const std::string &Name, DIE *Entity) { + // FIXME - check for duplication. + GlobalEntities[Name] = Entity; } /// NewCompileUnit - Create new compile unit information. /// DIE *DwarfWriter::NewCompileUnit(const std::string &Directory, const std::string &SourceName) { - DIE *Die = NewDIE(AbbrevTAG_compile_unit); + DIE *Unit = new DIE(DW_TAG_compile_unit, DW_CHILDREN_yes); // FIXME - use the correct line set. - Die->AddValue(DWLabel("line", 0)); - Die->AddValue(DWLabel("text_end", 0)); - Die->AddValue(DWLabel("text_begin", 0)); + Unit->AddLabel (DW_AT_stmt_list, DW_FORM_data4, DWLabel("line", 0)); + Unit->AddLabel (DW_AT_high_pc, DW_FORM_addr, DWLabel("text_end", 0)); + Unit->AddLabel (DW_AT_low_pc, DW_FORM_addr, DWLabel("text_begin", 0)); // FIXME - The producer needs to be in this form, but should come from // an appropriate source. - Die->AddValue("llvm 3.4.x (LLVM Research Group)"); - Die->AddValue(DW_LANG_C89); - Die->AddValue(SourceName); - Die->AddValue(Directory); + Unit->AddString(DW_AT_producer, DW_FORM_string, + "llvm 3.4.x (LLVM Research Group)"); + Unit->AddInt (DW_AT_language, DW_FORM_data1, DW_LANG_C89); + Unit->AddString(DW_AT_name, DW_FORM_string, SourceName); + Unit->AddString(DW_AT_comp_dir, DW_FORM_string, Directory); + Unit->Complete(*this); - return Die; + return Unit; } /// EmitInitial - Emit initial Dwarf declarations. This is necessary for cc @@ -1003,11 +1221,12 @@ " "); const std::vector &Values = Die->getValues(); + const std::vector &AbbrevData = Abbrev.getData(); // Emit the DIE attribute values. for (unsigned i = 0, N = Values.size(); i < N; i++) { - unsigned Attr = Abbrev.getAttribute(i); - unsigned Form = Abbrev.getForm(i); + unsigned Attr = AbbrevData[i].getAttribute(); + unsigned Form = AbbrevData[i].getForm(); assert(Form && "Too many attributes for DIE (check abbreviation)"); switch (Attr) { @@ -1053,11 +1272,12 @@ Offset += SizeULEB128(AbbrevID); const std::vector &Values = Die->getValues(); + const std::vector &AbbrevData = Abbrev.getData(); // Emit the DIE attribute values. for (unsigned i = 0, N = Values.size(); i < N; i++) { // Size attribute value. - Offset += Values[i]->SizeOf(*this, Abbrev.getForm(i)); + Offset += Values[i]->SizeOf(*this, AbbrevData[i].getForm()); } // Emit the DIE children if any. @@ -1085,7 +1305,7 @@ unsigned Offset = sizeof(int32_t) + // Length of Compilation Unit Info sizeof(int16_t) + // DWARF version number sizeof(int32_t) + // Offset Into Abbrev. Section - sizeof(int8_t); // Pointer Size (in bytes) + sizeof(int8_t); // Pointer Size (in bytes) // Process each compile unit. for (unsigned i = 0, N = CompileUnits.size(); i < N; i++) { @@ -1104,6 +1324,8 @@ // If there are any compile units. if (N) { + EmitLabel("info_begin", 0); + // Emit the compile units header. // Emit size of content not including length itself @@ -1113,7 +1335,7 @@ EmitShort(DWARF_VERSION); EOL("DWARF version number"); - EmitReference("abbrev", 0); EOL("Offset Into Abbrev. Section"); + EmitReference("abbrev_begin", 0); EOL("Offset Into Abbrev. Section"); EmitByte(AddressSize); EOL("Address Size (in bytes)"); @@ -1121,52 +1343,35 @@ for (unsigned i = 0; i < N; i++) { EmitDIE(CompileUnits[i]); } + + EmitLabel("info_end", 0); } } /// EmitAbbreviations - Emit the abbreviation section. /// void DwarfWriter::EmitAbbreviations() const { - // Start the debug abbrev section. - Asm->SwitchSection(DwarfAbbrevSection, 0); - - // For each abbrevation. - for (unsigned AbbrevID = 1, NAID = Abbreviations.size(); - AbbrevID <= NAID; AbbrevID++) { - // Get abbreviation data - const DIEAbbrev &Abbrev = Abbreviations[AbbrevID]; - - // Emit the abbrevations code (base 1 index.) - EmitULEB128Bytes(AbbrevID); EOL("Abbreviation Code"); - - // Emit its Dwarf tag type. - EmitULEB128Bytes(Abbrev.getTag()); - EOL(TagString(Abbrev.getTag())); - - // Emit whether it has children DIEs. - EmitULEB128Bytes(Abbrev.getChildrenFlag()); - EOL(ChildrenString(Abbrev.getChildrenFlag())); - - // For each attribute description. - for (unsigned i = 0; ; i++) { - unsigned Attr = Abbrev.getAttribute(i); - unsigned Form = Abbrev.getForm(i); - - // Attributes are null terminated. - if (!Attr) break; + // Check to see if it is worth the effort. + if (!Abbreviations.empty()) { + // Start the debug abbrev section. + Asm->SwitchSection(DwarfAbbrevSection, 0); + + EmitLabel("abbrev_begin", 0); + + // For each abbrevation. + for (unsigned AbbrevID = 1, NAID = Abbreviations.size(); + AbbrevID <= NAID; AbbrevID++) { + // Get abbreviation data + const DIEAbbrev &Abbrev = Abbreviations[AbbrevID]; - // Emit attribute type. - EmitULEB128Bytes(Attr); - EOL(AttributeString(Attr)); + // Emit the abbrevations code (base 1 index.) + EmitULEB128Bytes(AbbrevID); EOL("Abbreviation Code"); - // Emit form type. - EmitULEB128Bytes(Form); - EOL(FormEncodingString(Form)); + // Emit the abbreviations data. + Abbrev.Emit(*this); } - - // Mark end of abbreviation. - EmitULEB128Bytes(0); EOL("EOM(1)"); - EmitULEB128Bytes(0); EOL("EOM(2)"); + + EmitLabel("abbrev_end", 0); } } @@ -1303,22 +1508,67 @@ /// EmitDebugPubNames - Emit visible names into a debug pubnames section. /// void DwarfWriter::EmitDebugPubNames() { - // Start the dwarf pubnames section. - Asm->SwitchSection(DwarfPubNamesSection, 0); + // Check to see if it is worth the effort. + if (!GlobalEntities.empty()) { + // Start the dwarf pubnames section. + Asm->SwitchSection(DwarfPubNamesSection, 0); + + EmitDifference("pubnames_end", 0, "pubnames_begin", 0); + EOL("Length of Public Names Info"); + + EmitLabel("pubnames_begin", 0); + + EmitShort(DWARF_VERSION); EOL("DWARF Version"); + + EmitReference("info_begin", 0); EOL("Offset of Compilation Unit Info"); + + EmitDifference("info_end", 0, "info_begin", 0); + EOL("Compilation Unit Length"); + + for (std::map::iterator G = GlobalTypes.begin(), + GE = GlobalTypes.begin(); + G != GE; G++) { + const std::string &Name = (*G).first; + DIE * Entity = (*G).second; + + EmitLong(Entity->getOffset()); EOL("DIE offset"); + EmitString(Name); EOL("External Name"); + + } + + EmitLong(0); EOL("End Mark"); + EmitLabel("pubnames_end", 0); + } } /// EmitDebugPubTypes - Emit visible names into a debug pubtypes section. /// void DwarfWriter::EmitDebugPubTypes() { - // Start the dwarf pubtypes section. - Asm->SwitchSection(DwarfPubTypesSection, 0); + // Check to see if it is worth the effort. + if (!GlobalTypes.empty()) { + // Start the dwarf pubtypes section. + Asm->SwitchSection(DwarfPubTypesSection, 0); + } } /// EmitDebugStr - Emit visible names into a debug str section. /// void DwarfWriter::EmitDebugStr() { - // Start the dwarf str section. - Asm->SwitchSection(DwarfStrSection, 0); + // Check to see if it is worth the effort. + if (!StringPool.empty()) { + // Start the dwarf str section. + Asm->SwitchSection(DwarfStrSection, 0); + + // For each of strings in teh string pool. + for (unsigned StringID = 1, N = StringPool.size(); + StringID <= N; StringID++) { + // Emit a label for reference from debug information entries. + EmitLabel("string", StringID); + // Emit the string itself. + const std::string &String = StringPool[StringID]; + EmitString(String); O << "\n"; + } + } } /// EmitDebugLoc - Emit visible names into a debug loc section. @@ -1341,7 +1591,7 @@ EmitShort(DWARF_VERSION); EOL("Dwarf Version"); - EmitReference("info", 0); EOL("Offset of Compilation Unit Info"); + EmitReference("info_begin", 0); EOL("Offset of Compilation Unit Info"); EmitByte(AddressSize); EOL("Size of Address"); @@ -1389,7 +1639,7 @@ } //===----------------------------------------------------------------------===// -// Main enties. +// Main entry points. // DwarfWriter::DwarfWriter(std::ostream &o, AsmPrinter *ap) @@ -1399,6 +1649,9 @@ , didInitial(false) , CompileUnits() , Abbreviations() + , GlobalTypes() + , GlobalEntities() + , StringPool() , AddressSize(sizeof(int32_t)) , hasLEB128(false) , hasDotLoc(false) @@ -1419,6 +1672,9 @@ , DataSection(".data") {} DwarfWriter::~DwarfWriter() { + for (unsigned i = 0, N = CompileUnits.size(); i < N; i++) { + delete CompileUnits[i]; + } } /// BeginModule - Emit all Dwarf sections that should come prior to the content. @@ -1439,7 +1695,7 @@ EmitLabel("text_end", 0); Asm->SwitchSection(DataSection, 0); EmitLabel("data_end", 0); - + // Get directory and source information. const UniqueVector &Directories = DebugInfo->getDirectories(); const UniqueVector &SourceFiles = DebugInfo->getSourceFiles(); @@ -1450,8 +1706,16 @@ const SourceFileInfo &SourceFile = SourceFiles[SourceID]; const std::string &Directory = Directories[SourceFile.getDirectoryID()]; const std::string &SourceName = SourceFile.getName(); - DIE *CompileUnit = NewCompileUnit(Directory, SourceName); - CompileUnits.push_back(CompileUnit); + DIE *Unit = NewCompileUnit(Directory, SourceName); + +#if 0 + // FIXME - just testing. + DWContext *Context = new DWContext(*this, Unit); + DIE *TypeInt = Context->NewBasicType("int", sizeof(int32_t), DW_ATE_signed); + Context->NewVariable("MyGlobal", SourceID, 1, TypeInt, true); +#endif + + CompileUnits.push_back(Unit); } // Compute DIE offsets and sizes. From bocchino at persephone.cs.uiuc.edu Fri Jan 20 14:44:27 2006 From: bocchino at persephone.cs.uiuc.edu (Robert L. Bocchino Jr.) Date: Fri, 20 Jan 2006 14:44:27 -0600 (CST) Subject: [llvm-commits] CVS: llvm/lib/Target/CBackend/Writer.cpp Message-ID: <20060120204427.BC6D51D7FFAC@persephone.cs.uiuc.edu> Changes in directory llvm/lib/Target/CBackend: Writer.cpp updated: 1.251 -> 1.252 --- Log message: Make the C writer work with packed types. printContainedStructs is still not quite right and will be fixed later. --- Diffs of the changes: (+49 -4) Writer.cpp | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 49 insertions(+), 4 deletions(-) Index: llvm/lib/Target/CBackend/Writer.cpp diff -u llvm/lib/Target/CBackend/Writer.cpp:1.251 llvm/lib/Target/CBackend/Writer.cpp:1.252 --- llvm/lib/Target/CBackend/Writer.cpp:1.251 Fri Jan 20 12:57:03 2006 +++ llvm/lib/Target/CBackend/Writer.cpp Fri Jan 20 14:43:57 2006 @@ -132,6 +132,7 @@ void printConstant(Constant *CPV); void printConstantArray(ConstantArray *CPA); + void printConstantPacked(ConstantPacked *CP); // isInlinableInst - Attempt to inline instructions into their uses to build // trees as much as possible. To do this, we have to consistently decide @@ -329,7 +330,8 @@ const PointerType *PTy = cast(Ty); std::string ptrName = "*" + NameSoFar; - if (isa(PTy->getElementType())) + if (isa(PTy->getElementType()) || + isa(PTy->getElementType())) ptrName = "(" + ptrName + ")"; return printType(Out, PTy->getElementType(), ptrName); @@ -343,6 +345,14 @@ NameSoFar + "[" + utostr(NumElements) + "]"); } + case Type::PackedTyID: { + const PackedType *PTy = cast(Ty); + unsigned NumElements = PTy->getNumElements(); + if (NumElements == 0) NumElements = 1; + return printType(Out, PTy->getElementType(), + NameSoFar + "[" + utostr(NumElements) + "]"); + } + case Type::OpaqueTyID: { static int Count = 0; std::string TyName = "struct opaque_" + itostr(Count++); @@ -426,6 +436,19 @@ } } +void CWriter::printConstantPacked(ConstantPacked *CP) { + Out << '{'; + if (CP->getNumOperands()) { + Out << ' '; + printConstant(cast(CP->getOperand(0))); + for (unsigned i = 1, e = CP->getNumOperands(); i != e; ++i) { + Out << ", "; + printConstant(cast(CP->getOperand(i))); + } + } + Out << " }"; +} + // isFPCSafeToPrint - Returns true if we may assume that CFP may be written out // textually as a double (rather than as a reference to a stack-allocated // variable). We decide this by converting CFP to a string and back into a @@ -641,6 +664,25 @@ } break; + case Type::PackedTyID: + if (isa(CPV) || isa(CPV)) { + const PackedType *AT = cast(CPV->getType()); + Out << '{'; + if (AT->getNumElements()) { + Out << ' '; + Constant *CZ = Constant::getNullValue(AT->getElementType()); + printConstant(CZ); + for (unsigned i = 1, e = AT->getNumElements(); i != e; ++i) { + Out << ", "; + printConstant(CZ); + } + } + Out << " }"; + } else { + printConstantPacked(cast(CPV)); + } + break; + case Type::StructTyID: if (isa(CPV) || isa(CPV)) { const StructType *ST = cast(CPV->getType()); @@ -936,7 +978,8 @@ // the compiler figure out the rest of the zeros. Out << " = " ; if (isa(I->getInitializer()->getType()) || - isa(I->getInitializer()->getType())) { + isa(I->getInitializer()->getType()) || + isa(I->getInitializer()->getType())) { Out << "{ 0 }"; } else { // Just print it out normally. @@ -987,7 +1030,7 @@ /// printSymbolTable - Run through symbol table looking for type names. If a -/// type name is found, emit it's declaration... +/// type name is found, emit its declaration... /// void CWriter::printModuleTypes(const SymbolTable &ST) { // We are only interested in the type plane of the symbol table. @@ -1035,6 +1078,9 @@ // Push the struct onto the stack and recursively push all structs // this one depends on. +// +// TODO: Make this work properly with packed types +// void CWriter::printContainedStructs(const Type *Ty, std::set &StructPrinted){ // Don't walk through pointers. @@ -1055,7 +1101,6 @@ } } } - void CWriter::printFunctionSignature(const Function *F, bool Prototype) { if (F->hasInternalLinkage()) Out << "static "; From jlaskey at apple.com Fri Jan 20 15:02:47 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 15:02:47 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601202102.PAA01861@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.12 -> 1.13 --- Log message: Right size integer values before emitting. --- Diffs of the changes: (+2 -1) DwarfWriter.h | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.12 llvm/include/llvm/CodeGen/DwarfWriter.h:1.13 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.12 Fri Jan 20 14:34:06 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Fri Jan 20 15:02:35 2006 @@ -721,7 +721,8 @@ /// AddInt - Add a simple integer attribute data and value. /// - void AddInt(unsigned Attribute, unsigned Form, int Integer); + void AddInt(unsigned Attribute, unsigned Form, + int Integer, bool IsSigned = false); /// AddString - Add a std::string attribute data and value. /// From jlaskey at apple.com Fri Jan 20 15:02:48 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 15:02:48 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200601202102.PAA01865@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.9 -> 1.10 --- Log message: Right size integer values before emitting. --- Diffs of the changes: (+24 -8) DwarfWriter.cpp | 32 ++++++++++++++++++++++++-------- 1 files changed, 24 insertions(+), 8 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.9 llvm/lib/CodeGen/DwarfWriter.cpp:1.10 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.9 Fri Jan 20 14:34:06 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Fri Jan 20 15:02:36 2006 @@ -673,10 +673,12 @@ /// void DIEInteger::EmitValue(const DwarfWriter &DW, unsigned Form) const { switch (Form) { - case DW_FORM_data1: // Fall thru - case DW_FORM_flag: DW.EmitByte(Integer); break; - case DW_FORM_data2: DW.EmitShort(Integer); break; - case DW_FORM_data4: DW.EmitLong(Integer); break; + case DW_FORM_flag: // Fall thru + case DW_FORM_data1: DW.EmitByte(Integer); break; + case DW_FORM_data2: DW.EmitShort(Integer); break; + case DW_FORM_data4: DW.EmitLong(Integer); break; + case DW_FORM_udata: DW.EmitULEB128Bytes(Integer); break; + case DW_FORM_sdata: DW.EmitSLEB128Bytes(Integer); break; default: assert(0 && "DIE Value form not supported yet"); break; } } @@ -689,6 +691,8 @@ case DW_FORM_data1: return sizeof(int8_t); case DW_FORM_data2: return sizeof(int16_t); case DW_FORM_data4: return sizeof(int32_t); + case DW_FORM_udata: return DW.SizeULEB128(Integer); + case DW_FORM_sdata: return DW.SizeSLEB128(Integer); default: assert(0 && "DIE Value form not supported yet"); break; } return 0; @@ -705,7 +709,7 @@ /// SizeOf - Determine size of string value in bytes. /// unsigned DIEString::SizeOf(const DwarfWriter &DW, unsigned Form) const { - return String.size() + sizeof('\0'); + return String.size() + sizeof(char); // sizeof('\0'); } //===----------------------------------------------------------------------===// @@ -792,7 +796,18 @@ /// AddInt - Add a simple integer attribute data and value. /// void DIE::AddInt(unsigned Attribute, unsigned Form, - int Integer) { + int Integer, bool IsSigned) { + if (Form == 0) { + if (IsSigned) { + if ((char)Integer == Integer) Form = DW_FORM_data1; + else if ((short)Integer == Integer) Form = DW_FORM_data2; + else Form = DW_FORM_data4; + } else { + if ((unsigned char)Integer == Integer) Form = DW_FORM_data1; + else if ((unsigned short)Integer == Integer) Form = DW_FORM_data2; + else Form = DW_FORM_data4; + } + } Abbrev->AddAttribute(Attribute, Form); Values.push_back(new DIEInteger(Integer)); } @@ -892,10 +907,11 @@ assert(IsExternal && "Internal variables not handled yet"); Variable = new DIE(DW_TAG_variable, DW_CHILDREN_no); Variable->AddString (DW_AT_name, DW_FORM_string, Name); - Variable->AddInt (DW_AT_decl_file, DW_FORM_data1, SourceFileID); - Variable->AddInt (DW_AT_decl_line, DW_FORM_data1, Line); + Variable->AddInt (DW_AT_decl_file, 0, SourceFileID); + Variable->AddInt (DW_AT_decl_line, 0, Line); Variable->AddDIEntry (DW_AT_type, DW_FORM_ref4, Type); Variable->AddInt (DW_AT_external, DW_FORM_flag, (int)IsExternal); + // FIXME - needs to be an expression. Variable->AddAsIsLabel(DW_AT_location, DW_FORM_block1, std::string("_")+Name+".b"); Variable->Complete(DW); From jlaskey at apple.com Fri Jan 20 19:00:06 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 19:00:06 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601210100.TAA03276@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.13 -> 1.14 --- Log message: Correct some simple errors. --- Diffs of the changes: (+1 -1) DwarfWriter.h | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.13 llvm/include/llvm/CodeGen/DwarfWriter.h:1.14 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.13 Fri Jan 20 15:02:35 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Fri Jan 20 18:59:54 2006 @@ -994,7 +994,7 @@ EmitReference(Label.Tag, Label.Number); } void EmitReference(const char *Tag, unsigned Number) const; - void EmitReference(const std::string Name) const; + void EmitReference(const std::string &Name) const; /// EmitDifference - Emit the difference between two labels. Some /// assemblers do not behave with absolute expressions with data directives, From jlaskey at apple.com Fri Jan 20 19:00:07 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 19:00:07 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200601210100.TAA03280@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.10 -> 1.11 --- Log message: Correct some simple errors. --- Diffs of the changes: (+2 -2) DwarfWriter.cpp | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.10 llvm/lib/CodeGen/DwarfWriter.cpp:1.11 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.10 Fri Jan 20 15:02:36 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Fri Jan 20 18:59:54 2006 @@ -590,7 +590,7 @@ for (unsigned i = 0, N = Data.size(); i < N; i++) { const DIEAbbrevData &AttrData = Data[i]; - const DIEAbbrevData &DAAttrData = Data[i]; + const DIEAbbrevData &DAAttrData = DA.Data[i]; if (AttrData.getAttribute() != DAAttrData.getAttribute()) return false; if (AttrData.getForm() != DAAttrData.getForm()) return false; } @@ -1110,7 +1110,7 @@ PrintLabelName(Tag, Number); } -void DwarfWriter::EmitReference(const std::string Name) const { +void DwarfWriter::EmitReference(const std::string &Name) const { if (AddressSize == 4) O << Asm->Data32bitsDirective; else From jlaskey at apple.com Fri Jan 20 19:13:30 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 19:13:30 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/DwarfWriter.h Message-ID: <200601210113.TAA03314@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: DwarfWriter.h updated: 1.14 -> 1.15 --- Log message: Simplify search for abbreviations. --- Diffs of the changes: (+19 -0) DwarfWriter.h | 19 +++++++++++++++++++ 1 files changed, 19 insertions(+) Index: llvm/include/llvm/CodeGen/DwarfWriter.h diff -u llvm/include/llvm/CodeGen/DwarfWriter.h:1.14 llvm/include/llvm/CodeGen/DwarfWriter.h:1.15 --- llvm/include/llvm/CodeGen/DwarfWriter.h:1.14 Fri Jan 20 18:59:54 2006 +++ llvm/include/llvm/CodeGen/DwarfWriter.h Fri Jan 20 19:13:18 2006 @@ -476,6 +476,25 @@ // Accessors unsigned getAttribute() const { return Attribute; } unsigned getForm() const { return Form; } + + /// operator== - Used by DIEAbbrev to locate entry. + /// + bool operator==(const DIEAbbrevData &DAD) const { + return Attribute == DAD.Attribute && Form == DAD.Form; + } + + /// operator!= - Used by DIEAbbrev to locate entry. + /// + bool operator!=(const DIEAbbrevData &DAD) const { + return Attribute != DAD.Attribute || Form != DAD.Form; + } + + /// operator< - Used by DIEAbbrev to locate entry. + /// + bool operator<(const DIEAbbrevData &DAD) const { + return Attribute < DAD.Attribute || + (Attribute == DAD.Attribute && Form < DAD.Form); + } }; //===--------------------------------------------------------------------===// From jlaskey at apple.com Fri Jan 20 19:13:31 2006 From: jlaskey at apple.com (Jim Laskey) Date: Fri, 20 Jan 2006 19:13:31 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/DwarfWriter.cpp Message-ID: <200601210113.TAA03318@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen: DwarfWriter.cpp updated: 1.11 -> 1.12 --- Log message: Simplify search for abbreviations. --- Diffs of the changes: (+2 -10) DwarfWriter.cpp | 12 ++---------- 1 files changed, 2 insertions(+), 10 deletions(-) Index: llvm/lib/CodeGen/DwarfWriter.cpp diff -u llvm/lib/CodeGen/DwarfWriter.cpp:1.11 llvm/lib/CodeGen/DwarfWriter.cpp:1.12 --- llvm/lib/CodeGen/DwarfWriter.cpp:1.11 Fri Jan 20 18:59:54 2006 +++ llvm/lib/CodeGen/DwarfWriter.cpp Fri Jan 20 19:13:18 2006 @@ -589,10 +589,7 @@ if (Data.size() != DA.Data.size()) return false; for (unsigned i = 0, N = Data.size(); i < N; i++) { - const DIEAbbrevData &AttrData = Data[i]; - const DIEAbbrevData &DAAttrData = DA.Data[i]; - if (AttrData.getAttribute() != DAAttrData.getAttribute()) return false; - if (AttrData.getForm() != DAAttrData.getForm()) return false; + if (Data[i] != DA.Data[i]) return false; } return true; @@ -606,12 +603,7 @@ if (Data.size() != DA.Data.size()) return Data.size() < DA.Data.size(); for (unsigned i = 0, N = Data.size(); i < N; i++) { - const DIEAbbrevData &AttrData = Data[i]; - const DIEAbbrevData &DAAttrData = DA.Data[i]; - if (AttrData.getAttribute() != DAAttrData.getAttribute()) - return AttrData.getAttribute() < DAAttrData.getAttribute(); - if (AttrData.getForm() != DAAttrData.getForm()) - return AttrData.getForm() < DAAttrData.getForm(); + if (Data[i] != DA.Data[i]) return Data[i] < DA.Data[i]; } return false; From lattner at cs.uiuc.edu Fri Jan 20 19:35:38 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 19:35:38 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Message-ID: <200601210135.TAA03414@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/PowerPC: PPCAsmPrinter.cpp updated: 1.139 -> 1.140 --- Log message: trivial formatting improvement: don't insert extra blank lines between .comm vars. --- Diffs of the changes: (+1 -1) PPCAsmPrinter.cpp | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.139 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.140 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.139 Wed Jan 18 10:54:26 2006 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Fri Jan 20 19:35:26 2006 @@ -517,7 +517,6 @@ if (I->hasAppendingLinkage() && EmitSpecialLLVMGlobal(I)) continue; - O << '\n'; std::string name = Mang->getValueName(I); Constant *C = I->getInitializer(); unsigned Size = TD.getTypeSize(C->getType()); @@ -559,6 +558,7 @@ EmitAlignment(Align, I); O << name << ":\t\t\t\t; '" << I->getName() << "'\n"; EmitGlobalConstant(C); + O << '\n'; } } From evan.cheng at apple.com Fri Jan 20 20:32:18 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 20 Jan 2006 20:32:18 -0600 Subject: [llvm-commits] CVS: llvm/include/llvm/CodeGen/ScheduleDAG.h SelectionDAGISel.h Message-ID: <200601210232.UAA03679@zion.cs.uiuc.edu> Changes in directory llvm/include/llvm/CodeGen: ScheduleDAG.h added (r1.1) SelectionDAGISel.h updated: 1.7 -> 1.8 --- Log message: Do some code refactoring on Jim's scheduler in preparation of the new list scheduler. --- Diffs of the changes: (+289 -1) ScheduleDAG.h | 288 +++++++++++++++++++++++++++++++++++++++++++++++++++++ SelectionDAGISel.h | 2 2 files changed, 289 insertions(+), 1 deletion(-) Index: llvm/include/llvm/CodeGen/ScheduleDAG.h diff -c /dev/null llvm/include/llvm/CodeGen/ScheduleDAG.h:1.1 *** /dev/null Fri Jan 20 20:32:16 2006 --- llvm/include/llvm/CodeGen/ScheduleDAG.h Fri Jan 20 20:32:06 2006 *************** *** 0 **** --- 1,288 ---- + //===------- llvm/CodeGen/ScheduleDAG.h - Common Base Class------*- C++ -*-===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by Evan Cheng and is distributed under + // the University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This file implements the ScheduleDAG class, which is used as the common + // base class for SelectionDAG-based instruction scheduler. + // + //===----------------------------------------------------------------------===// + + #ifndef LLVM_CODEGEN_SCHEDULEDAG_H + #define LLVM_CODEGEN_SCHEDULEDAG_H + + #include "llvm/CodeGen/SelectionDAG.h" + + namespace llvm { + class InstrStage; + class MachineConstantPool; + class MachineDebugInfo; + class MachineInstr; + class MRegisterInfo; + class SelectionDAG; + class SSARegMap; + class TargetInstrInfo; + class TargetInstrDescriptor; + class TargetMachine; + + class NodeInfo; + typedef NodeInfo *NodeInfoPtr; + typedef std::vector NIVector; + typedef std::vector::iterator NIIterator; + + + //===--------------------------------------------------------------------===// + /// + /// Node group - This struct is used to manage flagged node groups. + /// + class NodeGroup { + private: + NIVector Members; // Group member nodes + NodeInfo *Dominator; // Node with highest latency + unsigned Latency; // Total latency of the group + int Pending; // Number of visits pending before + // adding to order + + public: + // Ctor. + NodeGroup() : Dominator(NULL), Pending(0) {} + + // Accessors + inline void setDominator(NodeInfo *D) { Dominator = D; } + inline NodeInfo *getDominator() { return Dominator; } + inline void setLatency(unsigned L) { Latency = L; } + inline unsigned getLatency() { return Latency; } + inline int getPending() const { return Pending; } + inline void setPending(int P) { Pending = P; } + inline int addPending(int I) { return Pending += I; } + + // Pass thru + inline bool group_empty() { return Members.empty(); } + inline NIIterator group_begin() { return Members.begin(); } + inline NIIterator group_end() { return Members.end(); } + inline void group_push_back(const NodeInfoPtr &NI) { + Members.push_back(NI); + } + inline NIIterator group_insert(NIIterator Pos, const NodeInfoPtr &NI) { + return Members.insert(Pos, NI); + } + inline void group_insert(NIIterator Pos, NIIterator First, + NIIterator Last) { + Members.insert(Pos, First, Last); + } + + static void Add(NodeInfo *D, NodeInfo *U); + static unsigned CountInternalUses(NodeInfo *D, NodeInfo *U); + }; + + //===--------------------------------------------------------------------===// + /// + /// NodeInfo - This struct tracks information used to schedule the a node. + /// + class NodeInfo { + private: + int Pending; // Number of visits pending before + // adding to order + public: + SDNode *Node; // DAG node + InstrStage *StageBegin; // First stage in itinerary + InstrStage *StageEnd; // Last+1 stage in itinerary + unsigned Latency; // Total cycles to complete instr + bool IsCall : 1; // Is function call + bool IsLoad : 1; // Is memory load + bool IsStore : 1; // Is memory store + unsigned Slot; // Node's time slot + NodeGroup *Group; // Grouping information + unsigned VRBase; // Virtual register base + #ifndef NDEBUG + unsigned Preorder; // Index before scheduling + #endif + + // Ctor. + NodeInfo(SDNode *N = NULL) + : Pending(0) + , Node(N) + , StageBegin(NULL) + , StageEnd(NULL) + , Latency(0) + , IsCall(false) + , Slot(0) + , Group(NULL) + , VRBase(0) + #ifndef NDEBUG + , Preorder(0) + #endif + {} + + // Accessors + inline bool isInGroup() const { + assert(!Group || !Group->group_empty() && "Group with no members"); + return Group != NULL; + } + inline bool isGroupDominator() const { + return isInGroup() && Group->getDominator() == this; + } + inline int getPending() const { + return Group ? Group->getPending() : Pending; + } + inline void setPending(int P) { + if (Group) Group->setPending(P); + else Pending = P; + } + inline int addPending(int I) { + if (Group) return Group->addPending(I); + else return Pending += I; + } + }; + + //===--------------------------------------------------------------------===// + /// + /// NodeGroupIterator - Iterates over all the nodes indicated by the node + /// info. If the node is in a group then iterate over the members of the + /// group, otherwise just the node info. + /// + class NodeGroupIterator { + private: + NodeInfo *NI; // Node info + NIIterator NGI; // Node group iterator + NIIterator NGE; // Node group iterator end + + public: + // Ctor. + NodeGroupIterator(NodeInfo *N) : NI(N) { + // If the node is in a group then set up the group iterator. Otherwise + // the group iterators will trip first time out. + if (N->isInGroup()) { + // get Group + NodeGroup *Group = NI->Group; + NGI = Group->group_begin(); + NGE = Group->group_end(); + // Prevent this node from being used (will be in members list + NI = NULL; + } + } + + /// next - Return the next node info, otherwise NULL. + /// + NodeInfo *next() { + // If members list + if (NGI != NGE) return *NGI++; + // Use node as the result (may be NULL) + NodeInfo *Result = NI; + // Only use once + NI = NULL; + // Return node or NULL + return Result; + } + }; + //===--------------------------------------------------------------------===// + + + //===--------------------------------------------------------------------===// + /// + /// NodeGroupOpIterator - Iterates over all the operands of a node. If the + /// node is a member of a group, this iterates over all the operands of all + /// the members of the group. + /// + class NodeGroupOpIterator { + private: + NodeInfo *NI; // Node containing operands + NodeGroupIterator GI; // Node group iterator + SDNode::op_iterator OI; // Operand iterator + SDNode::op_iterator OE; // Operand iterator end + + /// CheckNode - Test if node has more operands. If not get the next node + /// skipping over nodes that have no operands. + void CheckNode() { + // Only if operands are exhausted first + while (OI == OE) { + // Get next node info + NodeInfo *NI = GI.next(); + // Exit if nodes are exhausted + if (!NI) return; + // Get node itself + SDNode *Node = NI->Node; + // Set up the operand iterators + OI = Node->op_begin(); + OE = Node->op_end(); + } + } + + public: + // Ctor. + NodeGroupOpIterator(NodeInfo *N) + : NI(N), GI(N), OI(SDNode::op_iterator()), OE(SDNode::op_iterator()) {} + + /// isEnd - Returns true when not more operands are available. + /// + inline bool isEnd() { CheckNode(); return OI == OE; } + + /// next - Returns the next available operand. + /// + inline SDOperand next() { + assert(OI != OE && + "Not checking for end of NodeGroupOpIterator correctly"); + return *OI++; + } + }; + + class ScheduleDAG { + public: + SelectionDAG &DAG; // DAG of the current basic block + MachineBasicBlock *BB; // Current basic block + const TargetMachine &TM; // Target processor + const TargetInstrInfo *TII; // Target instruction information + const MRegisterInfo *MRI; // Target processor register info + SSARegMap *RegMap; // Virtual/real register map + MachineConstantPool *ConstPool; // Target constant pool + std::map Map; // Map nodes to info + + ScheduleDAG(SelectionDAG &dag, MachineBasicBlock *bb, + const TargetMachine &tm) + : DAG(dag), BB(bb), TM(tm) {} + + virtual ~ScheduleDAG() {}; + + /// Run - perform scheduling. + /// + MachineBasicBlock *Run(); + + /// getNI - Returns the node info for the specified node. + /// + NodeInfo *getNI(SDNode *Node) { return Map[Node]; } + + /// getVR - Returns the virtual register number of the node. + /// + unsigned getVR(SDOperand Op) { + NodeInfo *NI = getNI(Op.Val); + assert(NI->VRBase != 0 && "Node emitted out of order - late"); + return NI->VRBase + Op.ResNo; + } + + void EmitNode(NodeInfo *NI); + + virtual void Schedule() {}; + + virtual void print(std::ostream &O) const {}; + + void dump(const char *tag) const; + + void dump() const; + + private: + unsigned CreateVirtualRegisters(MachineInstr *MI, + unsigned NumResults, + const TargetInstrDescriptor &II); + }; + + /// createSimpleDAGScheduler - This creates a simple two pass instruction + /// scheduler. + ScheduleDAG* createSimpleDAGScheduler(SelectionDAG &DAG, + MachineBasicBlock *BB); + } + + #endif Index: llvm/include/llvm/CodeGen/SelectionDAGISel.h diff -u llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.7 llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.8 --- llvm/include/llvm/CodeGen/SelectionDAGISel.h:1.7 Thu Aug 18 13:44:33 2005 +++ llvm/include/llvm/CodeGen/SelectionDAGISel.h Fri Jan 20 20:32:06 2006 @@ -52,7 +52,7 @@ protected: /// Pick a safe ordering and emit instructions for each target node in the /// graph. - void ScheduleAndEmitDAG(SelectionDAG &SD); + void ScheduleAndEmitDAG(SelectionDAG &DAG); private: SDOperand CopyValueToVirtualRegister(SelectionDAGLowering &SDL, From evan.cheng at apple.com Fri Jan 20 20:32:19 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 20 Jan 2006 20:32:19 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSimple.cpp ScheduleDAG.cpp SelectionDAGISel.cpp Message-ID: <200601210232.UAA03687@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: ScheduleDAGSimple.cpp added (r1.1) ScheduleDAG.cpp updated: 1.55 -> 1.56 SelectionDAGISel.cpp updated: 1.129 -> 1.130 --- Log message: Do some code refactoring on Jim's scheduler in preparation of the new list scheduler. --- Diffs of the changes: (+933 -1131) ScheduleDAG.cpp | 1151 +------------------------------------------------- ScheduleDAGSimple.cpp | 891 ++++++++++++++++++++++++++++++++++++++ SelectionDAGISel.cpp | 22 3 files changed, 933 insertions(+), 1131 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSimple.cpp diff -c /dev/null llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSimple.cpp:1.1 *** /dev/null Fri Jan 20 20:32:16 2006 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAGSimple.cpp Fri Jan 20 20:32:06 2006 *************** *** 0 **** --- 1,891 ---- + //===-- ScheduleDAGSimple.cpp - Implement a trivial DAG scheduler ---------===// + // + // The LLVM Compiler Infrastructure + // + // This file was developed by James M. Laskey and is distributed under the + // University of Illinois Open Source License. See LICENSE.TXT for details. + // + //===----------------------------------------------------------------------===// + // + // This implements a simple two pass scheduler. The first pass attempts to push + // backward any lengthy instructions and critical paths. The second pass packs + // instructions into semi-optimal time slots. + // + //===----------------------------------------------------------------------===// + + #define DEBUG_TYPE "sched" + #include "llvm/CodeGen/ScheduleDAG.h" + #include "llvm/CodeGen/SelectionDAG.h" + #include "llvm/Target/TargetMachine.h" + #include "llvm/Target/TargetInstrInfo.h" + #include "llvm/Support/CommandLine.h" + #include "llvm/Support/Debug.h" + #include + #include + #include + using namespace llvm; + + namespace { + // Style of scheduling to use. + enum ScheduleChoices { + noScheduling, + simpleScheduling, + simpleNoItinScheduling + }; + } // namespace + + cl::opt ScheduleStyle("sched", + cl::desc("Choose scheduling style"), + cl::init(noScheduling), + cl::values( + clEnumValN(noScheduling, "none", + "Trivial emission with no analysis"), + clEnumValN(simpleScheduling, "simple", + "Minimize critical path and maximize processor utilization"), + clEnumValN(simpleNoItinScheduling, "simple-noitin", + "Same as simple except using generic latency"), + clEnumValEnd)); + + + namespace { + //===----------------------------------------------------------------------===// + /// + /// BitsIterator - Provides iteration through individual bits in a bit vector. + /// + template + class BitsIterator { + private: + T Bits; // Bits left to iterate through + + public: + /// Ctor. + BitsIterator(T Initial) : Bits(Initial) {} + + /// Next - Returns the next bit set or zero if exhausted. + inline T Next() { + // Get the rightmost bit set + T Result = Bits & -Bits; + // Remove from rest + Bits &= ~Result; + // Return single bit or zero + return Result; + } + }; + + //===----------------------------------------------------------------------===// + + + //===----------------------------------------------------------------------===// + /// + /// ResourceTally - Manages the use of resources over time intervals. Each + /// item (slot) in the tally vector represents the resources used at a given + /// moment. A bit set to 1 indicates that a resource is in use, otherwise + /// available. An assumption is made that the tally is large enough to schedule + /// all current instructions (asserts otherwise.) + /// + template + class ResourceTally { + private: + std::vector Tally; // Resources used per slot + typedef typename std::vector::iterator Iter; + // Tally iterator + + /// SlotsAvailable - Returns true if all units are available. + /// + bool SlotsAvailable(Iter Begin, unsigned N, unsigned ResourceSet, + unsigned &Resource) { + assert(N && "Must check availability with N != 0"); + // Determine end of interval + Iter End = Begin + N; + assert(End <= Tally.end() && "Tally is not large enough for schedule"); + + // Iterate thru each resource + BitsIterator Resources(ResourceSet & ~*Begin); + while (unsigned Res = Resources.Next()) { + // Check if resource is available for next N slots + Iter Interval = End; + do { + Interval--; + if (*Interval & Res) break; + } while (Interval != Begin); + + // If available for N + if (Interval == Begin) { + // Success + Resource = Res; + return true; + } + } + + // No luck + Resource = 0; + return false; + } + + /// RetrySlot - Finds a good candidate slot to retry search. + Iter RetrySlot(Iter Begin, unsigned N, unsigned ResourceSet) { + assert(N && "Must check availability with N != 0"); + // Determine end of interval + Iter End = Begin + N; + assert(End <= Tally.end() && "Tally is not large enough for schedule"); + + while (Begin != End--) { + // Clear units in use + ResourceSet &= ~*End; + // If no units left then we should go no further + if (!ResourceSet) return End + 1; + } + // Made it all the way through + return Begin; + } + + /// FindAndReserveStages - Return true if the stages can be completed. If + /// so mark as busy. + bool FindAndReserveStages(Iter Begin, + InstrStage *Stage, InstrStage *StageEnd) { + // If at last stage then we're done + if (Stage == StageEnd) return true; + // Get number of cycles for current stage + unsigned N = Stage->Cycles; + // Check to see if N slots are available, if not fail + unsigned Resource; + if (!SlotsAvailable(Begin, N, Stage->Units, Resource)) return false; + // Check to see if remaining stages are available, if not fail + if (!FindAndReserveStages(Begin + N, Stage + 1, StageEnd)) return false; + // Reserve resource + Reserve(Begin, N, Resource); + // Success + return true; + } + + /// Reserve - Mark busy (set) the specified N slots. + void Reserve(Iter Begin, unsigned N, unsigned Resource) { + // Determine end of interval + Iter End = Begin + N; + assert(End <= Tally.end() && "Tally is not large enough for schedule"); + + // Set resource bit in each slot + for (; Begin < End; Begin++) + *Begin |= Resource; + } + + /// FindSlots - Starting from Begin, locate consecutive slots where all stages + /// can be completed. Returns the address of first slot. + Iter FindSlots(Iter Begin, InstrStage *StageBegin, InstrStage *StageEnd) { + // Track position + Iter Cursor = Begin; + + // Try all possible slots forward + while (true) { + // Try at cursor, if successful return position. + if (FindAndReserveStages(Cursor, StageBegin, StageEnd)) return Cursor; + // Locate a better position + Cursor = RetrySlot(Cursor + 1, StageBegin->Cycles, StageBegin->Units); + } + } + + public: + /// Initialize - Resize and zero the tally to the specified number of time + /// slots. + inline void Initialize(unsigned N) { + Tally.assign(N, 0); // Initialize tally to all zeros. + } + + // FindAndReserve - Locate an ideal slot for the specified stages and mark + // as busy. + unsigned FindAndReserve(unsigned Slot, InstrStage *StageBegin, + InstrStage *StageEnd) { + // Where to begin + Iter Begin = Tally.begin() + Slot; + // Find a free slot + Iter Where = FindSlots(Begin, StageBegin, StageEnd); + // Distance is slot number + unsigned Final = Where - Tally.begin(); + return Final; + } + + }; + + //===----------------------------------------------------------------------===// + /// + /// ScheduleDAGSimple - Simple two pass scheduler. + /// + class ScheduleDAGSimple : public ScheduleDAG { + private: + unsigned NodeCount; // Number of nodes in DAG + bool HasGroups; // True if there are any groups + NodeInfo *Info; // Info for nodes being scheduled + NIVector Ordering; // Emit ordering of nodes + ResourceTally Tally; // Resource usage tally + unsigned NSlots; // Total latency + static const unsigned NotFound = ~0U; // Search marker + + public: + + // Ctor. + ScheduleDAGSimple(SelectionDAG &dag, MachineBasicBlock *bb, + const TargetMachine &tm) + : ScheduleDAG(dag, bb, tm), + NodeCount(0), HasGroups(false), Info(NULL), Tally(), NSlots(0) { + assert(&TII && "Target doesn't provide instr info?"); + assert(&MRI && "Target doesn't provide register info?"); + } + + virtual ~ScheduleDAGSimple() {}; + + private: + static bool isFlagDefiner(SDNode *A); + static bool isFlagUser(SDNode *A); + static bool isDefiner(NodeInfo *A, NodeInfo *B); + static bool isPassiveNode(SDNode *Node); + void IncludeNode(NodeInfo *NI); + void VisitAll(); + void Schedule(); + void IdentifyGroups(); + void GatherSchedulingInfo(); + void FakeGroupDominators(); + void PrepareNodeInfo(); + bool isStrongDependency(NodeInfo *A, NodeInfo *B); + bool isWeakDependency(NodeInfo *A, NodeInfo *B); + void ScheduleBackward(); + void ScheduleForward(); + void EmitAll(); + + void printChanges(unsigned Index); + void printSI(std::ostream &O, NodeInfo *NI) const; + void print(std::ostream &O) const; + }; + + + //===----------------------------------------------------------------------===// + /// Special case itineraries. + /// + enum { + CallLatency = 40, // To push calls back in time + + RSInteger = 0xC0000000, // Two integer units + RSFloat = 0x30000000, // Two float units + RSLoadStore = 0x0C000000, // Two load store units + RSBranch = 0x02000000 // One branch unit + }; + static InstrStage CallStage = { CallLatency, RSBranch }; + static InstrStage LoadStage = { 5, RSLoadStore }; + static InstrStage StoreStage = { 2, RSLoadStore }; + static InstrStage IntStage = { 2, RSInteger }; + static InstrStage FloatStage = { 3, RSFloat }; + //===----------------------------------------------------------------------===// + + + //===----------------------------------------------------------------------===// + + } // namespace + + //===----------------------------------------------------------------------===// + + + //===----------------------------------------------------------------------===// + /// Add - Adds a definer and user pair to a node group. + /// + void NodeGroup::Add(NodeInfo *D, NodeInfo *U) { + // Get current groups + NodeGroup *DGroup = D->Group; + NodeGroup *UGroup = U->Group; + // If both are members of groups + if (DGroup && UGroup) { + // There may have been another edge connecting + if (DGroup == UGroup) return; + // Add the pending users count + DGroup->addPending(UGroup->getPending()); + // For each member of the users group + NodeGroupIterator UNGI(U); + while (NodeInfo *UNI = UNGI.next() ) { + // Change the group + UNI->Group = DGroup; + // For each member of the definers group + NodeGroupIterator DNGI(D); + while (NodeInfo *DNI = DNGI.next() ) { + // Remove internal edges + DGroup->addPending(-CountInternalUses(DNI, UNI)); + } + } + // Merge the two lists + DGroup->group_insert(DGroup->group_end(), + UGroup->group_begin(), UGroup->group_end()); + } else if (DGroup) { + // Make user member of definers group + U->Group = DGroup; + // Add users uses to definers group pending + DGroup->addPending(U->Node->use_size()); + // For each member of the definers group + NodeGroupIterator DNGI(D); + while (NodeInfo *DNI = DNGI.next() ) { + // Remove internal edges + DGroup->addPending(-CountInternalUses(DNI, U)); + } + DGroup->group_push_back(U); + } else if (UGroup) { + // Make definer member of users group + D->Group = UGroup; + // Add definers uses to users group pending + UGroup->addPending(D->Node->use_size()); + // For each member of the users group + NodeGroupIterator UNGI(U); + while (NodeInfo *UNI = UNGI.next() ) { + // Remove internal edges + UGroup->addPending(-CountInternalUses(D, UNI)); + } + UGroup->group_insert(UGroup->group_begin(), D); + } else { + D->Group = U->Group = DGroup = new NodeGroup(); + DGroup->addPending(D->Node->use_size() + U->Node->use_size() - + CountInternalUses(D, U)); + DGroup->group_push_back(D); + DGroup->group_push_back(U); + } + } + + /// CountInternalUses - Returns the number of edges between the two nodes. + /// + unsigned NodeGroup::CountInternalUses(NodeInfo *D, NodeInfo *U) { + unsigned N = 0; + for (unsigned M = U->Node->getNumOperands(); 0 < M--;) { + SDOperand Op = U->Node->getOperand(M); + if (Op.Val == D->Node) N++; + } + + return N; + } + //===----------------------------------------------------------------------===// + + + //===----------------------------------------------------------------------===// + /// isFlagDefiner - Returns true if the node defines a flag result. + bool ScheduleDAGSimple::isFlagDefiner(SDNode *A) { + unsigned N = A->getNumValues(); + return N && A->getValueType(N - 1) == MVT::Flag; + } + + /// isFlagUser - Returns true if the node uses a flag result. + /// + bool ScheduleDAGSimple::isFlagUser(SDNode *A) { + unsigned N = A->getNumOperands(); + return N && A->getOperand(N - 1).getValueType() == MVT::Flag; + } + + /// isDefiner - Return true if node A is a definer for B. + /// + bool ScheduleDAGSimple::isDefiner(NodeInfo *A, NodeInfo *B) { + // While there are A nodes + NodeGroupIterator NII(A); + while (NodeInfo *NI = NII.next()) { + // Extract node + SDNode *Node = NI->Node; + // While there operands in nodes of B + NodeGroupOpIterator NGOI(B); + while (!NGOI.isEnd()) { + SDOperand Op = NGOI.next(); + // If node from A defines a node in B + if (Node == Op.Val) return true; + } + } + return false; + } + + /// isPassiveNode - Return true if the node is a non-scheduled leaf. + /// + bool ScheduleDAGSimple::isPassiveNode(SDNode *Node) { + if (isa(Node)) return true; + if (isa(Node)) return true; + if (isa(Node)) return true; + if (isa(Node)) return true; + if (isa(Node)) return true; + if (isa(Node)) return true; + if (isa(Node)) return true; + return false; + } + + /// IncludeNode - Add node to NodeInfo vector. + /// + void ScheduleDAGSimple::IncludeNode(NodeInfo *NI) { + // Get node + SDNode *Node = NI->Node; + // Ignore entry node + if (Node->getOpcode() == ISD::EntryToken) return; + // Check current count for node + int Count = NI->getPending(); + // If the node is already in list + if (Count < 0) return; + // Decrement count to indicate a visit + Count--; + // If count has gone to zero then add node to list + if (!Count) { + // Add node + if (NI->isInGroup()) { + Ordering.push_back(NI->Group->getDominator()); + } else { + Ordering.push_back(NI); + } + // indicate node has been added + Count--; + } + // Mark as visited with new count + NI->setPending(Count); + } + + /// VisitAll - Visit each node breadth-wise to produce an initial ordering. + /// Note that the ordering in the Nodes vector is reversed. + void ScheduleDAGSimple::VisitAll() { + // Add first element to list + NodeInfo *NI = getNI(DAG.getRoot().Val); + if (NI->isInGroup()) { + Ordering.push_back(NI->Group->getDominator()); + } else { + Ordering.push_back(NI); + } + + // Iterate through all nodes that have been added + for (unsigned i = 0; i < Ordering.size(); i++) { // note: size() varies + // Visit all operands + NodeGroupOpIterator NGI(Ordering[i]); + while (!NGI.isEnd()) { + // Get next operand + SDOperand Op = NGI.next(); + // Get node + SDNode *Node = Op.Val; + // Ignore passive nodes + if (isPassiveNode(Node)) continue; + // Check out node + IncludeNode(getNI(Node)); + } + } + + // Add entry node last (IncludeNode filters entry nodes) + if (DAG.getEntryNode().Val != DAG.getRoot().Val) + Ordering.push_back(getNI(DAG.getEntryNode().Val)); + + // Reverse the order + std::reverse(Ordering.begin(), Ordering.end()); + } + + /// IdentifyGroups - Put flagged nodes into groups. + /// + void ScheduleDAGSimple::IdentifyGroups() { + for (unsigned i = 0, N = NodeCount; i < N; i++) { + NodeInfo* NI = &Info[i]; + SDNode *Node = NI->Node; + + // For each operand (in reverse to only look at flags) + for (unsigned N = Node->getNumOperands(); 0 < N--;) { + // Get operand + SDOperand Op = Node->getOperand(N); + // No more flags to walk + if (Op.getValueType() != MVT::Flag) break; + // Add to node group + NodeGroup::Add(getNI(Op.Val), NI); + // Let evryone else know + HasGroups = true; + } + } + } + + /// GatherSchedulingInfo - Get latency and resource information about each node. + /// + void ScheduleDAGSimple::GatherSchedulingInfo() { + // Get instruction itineraries for the target + const InstrItineraryData InstrItins = TM.getInstrItineraryData(); + + // For each node + for (unsigned i = 0, N = NodeCount; i < N; i++) { + // Get node info + NodeInfo* NI = &Info[i]; + SDNode *Node = NI->Node; + + // If there are itineraries and it is a machine instruction + if (InstrItins.isEmpty() || ScheduleStyle == simpleNoItinScheduling) { + // If machine opcode + if (Node->isTargetOpcode()) { + // Get return type to guess which processing unit + MVT::ValueType VT = Node->getValueType(0); + // Get machine opcode + MachineOpCode TOpc = Node->getTargetOpcode(); + NI->IsCall = TII->isCall(TOpc); + NI->IsLoad = TII->isLoad(TOpc); + NI->IsStore = TII->isStore(TOpc); + + if (TII->isLoad(TOpc)) NI->StageBegin = &LoadStage; + else if (TII->isStore(TOpc)) NI->StageBegin = &StoreStage; + else if (MVT::isInteger(VT)) NI->StageBegin = &IntStage; + else if (MVT::isFloatingPoint(VT)) NI->StageBegin = &FloatStage; + if (NI->StageBegin) NI->StageEnd = NI->StageBegin + 1; + } + } else if (Node->isTargetOpcode()) { + // get machine opcode + MachineOpCode TOpc = Node->getTargetOpcode(); + // Check to see if it is a call + NI->IsCall = TII->isCall(TOpc); + // Get itinerary stages for instruction + unsigned II = TII->getSchedClass(TOpc); + NI->StageBegin = InstrItins.begin(II); + NI->StageEnd = InstrItins.end(II); + } + + // One slot for the instruction itself + NI->Latency = 1; + + // Add long latency for a call to push it back in time + if (NI->IsCall) NI->Latency += CallLatency; + + // Sum up all the latencies + for (InstrStage *Stage = NI->StageBegin, *E = NI->StageEnd; + Stage != E; Stage++) { + NI->Latency += Stage->Cycles; + } + + // Sum up all the latencies for max tally size + NSlots += NI->Latency; + } + + // Unify metrics if in a group + if (HasGroups) { + for (unsigned i = 0, N = NodeCount; i < N; i++) { + NodeInfo* NI = &Info[i]; + + if (NI->isInGroup()) { + NodeGroup *Group = NI->Group; + + if (!Group->getDominator()) { + NIIterator NGI = Group->group_begin(), NGE = Group->group_end(); + NodeInfo *Dominator = *NGI; + unsigned Latency = 0; + + for (NGI++; NGI != NGE; NGI++) { + NodeInfo* NGNI = *NGI; + Latency += NGNI->Latency; + if (Dominator->Latency < NGNI->Latency) Dominator = NGNI; + } + + Dominator->Latency = Latency; + Group->setDominator(Dominator); + } + } + } + } + } + + /// FakeGroupDominators - Set dominators for non-scheduling. + /// + void ScheduleDAGSimple::FakeGroupDominators() { + for (unsigned i = 0, N = NodeCount; i < N; i++) { + NodeInfo* NI = &Info[i]; + + if (NI->isInGroup()) { + NodeGroup *Group = NI->Group; + + if (!Group->getDominator()) { + Group->setDominator(NI); + } + } + } + } + + /// PrepareNodeInfo - Set up the basic minimum node info for scheduling. + /// + void ScheduleDAGSimple::PrepareNodeInfo() { + // Allocate node information + Info = new NodeInfo[NodeCount]; + + unsigned i = 0; + for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(), + E = DAG.allnodes_end(); I != E; ++I, ++i) { + // Fast reference to node schedule info + NodeInfo* NI = &Info[i]; + // Set up map + Map[I] = NI; + // Set node + NI->Node = I; + // Set pending visit count + NI->setPending(I->use_size()); + } + } + + /// isStrongDependency - Return true if node A has results used by node B. + /// I.E., B must wait for latency of A. + bool ScheduleDAGSimple::isStrongDependency(NodeInfo *A, NodeInfo *B) { + // If A defines for B then it's a strong dependency or + // if a load follows a store (may be dependent but why take a chance.) + return isDefiner(A, B) || (A->IsStore && B->IsLoad); + } + + /// isWeakDependency Return true if node A produces a result that will + /// conflict with operands of B. It is assumed that we have called + /// isStrongDependency prior. + bool ScheduleDAGSimple::isWeakDependency(NodeInfo *A, NodeInfo *B) { + // TODO check for conflicting real registers and aliases + #if 0 // FIXME - Since we are in SSA form and not checking register aliasing + return A->Node->getOpcode() == ISD::EntryToken || isStrongDependency(B, A); + #else + return A->Node->getOpcode() == ISD::EntryToken; + #endif + } + + /// ScheduleBackward - Schedule instructions so that any long latency + /// instructions and the critical path get pushed back in time. Time is run in + /// reverse to allow code reuse of the Tally and eliminate the overhead of + /// biasing every slot indices against NSlots. + void ScheduleDAGSimple::ScheduleBackward() { + // Size and clear the resource tally + Tally.Initialize(NSlots); + // Get number of nodes to schedule + unsigned N = Ordering.size(); + + // For each node being scheduled + for (unsigned i = N; 0 < i--;) { + NodeInfo *NI = Ordering[i]; + // Track insertion + unsigned Slot = NotFound; + + // Compare against those previously scheduled nodes + unsigned j = i + 1; + for (; j < N; j++) { + // Get following instruction + NodeInfo *Other = Ordering[j]; + + // Check dependency against previously inserted nodes + if (isStrongDependency(NI, Other)) { + Slot = Other->Slot + Other->Latency; + break; + } else if (isWeakDependency(NI, Other)) { + Slot = Other->Slot; + break; + } + } + + // If independent of others (or first entry) + if (Slot == NotFound) Slot = 0; + + #if 0 // FIXME - measure later + // Find a slot where the needed resources are available + if (NI->StageBegin != NI->StageEnd) + Slot = Tally.FindAndReserve(Slot, NI->StageBegin, NI->StageEnd); + #endif + + // Set node slot + NI->Slot = Slot; + + // Insert sort based on slot + j = i + 1; + for (; j < N; j++) { + // Get following instruction + NodeInfo *Other = Ordering[j]; + // Should we look further (remember slots are in reverse time) + if (Slot >= Other->Slot) break; + // Shuffle other into ordering + Ordering[j - 1] = Other; + } + // Insert node in proper slot + if (j != i + 1) Ordering[j - 1] = NI; + } + } + + /// ScheduleForward - Schedule instructions to maximize packing. + /// + void ScheduleDAGSimple::ScheduleForward() { + // Size and clear the resource tally + Tally.Initialize(NSlots); + // Get number of nodes to schedule + unsigned N = Ordering.size(); + + // For each node being scheduled + for (unsigned i = 0; i < N; i++) { + NodeInfo *NI = Ordering[i]; + // Track insertion + unsigned Slot = NotFound; + + // Compare against those previously scheduled nodes + unsigned j = i; + for (; 0 < j--;) { + // Get following instruction + NodeInfo *Other = Ordering[j]; + + // Check dependency against previously inserted nodes + if (isStrongDependency(Other, NI)) { + Slot = Other->Slot + Other->Latency; + break; + } else if (Other->IsCall || isWeakDependency(Other, NI)) { + Slot = Other->Slot; + break; + } + } + + // If independent of others (or first entry) + if (Slot == NotFound) Slot = 0; + + // Find a slot where the needed resources are available + if (NI->StageBegin != NI->StageEnd) + Slot = Tally.FindAndReserve(Slot, NI->StageBegin, NI->StageEnd); + + // Set node slot + NI->Slot = Slot; + + // Insert sort based on slot + j = i; + for (; 0 < j--;) { + // Get prior instruction + NodeInfo *Other = Ordering[j]; + // Should we look further + if (Slot >= Other->Slot) break; + // Shuffle other into ordering + Ordering[j + 1] = Other; + } + // Insert node in proper slot + if (j != i) Ordering[j + 1] = NI; + } + } + + /// EmitAll - Emit all nodes in schedule sorted order. + /// + void ScheduleDAGSimple::EmitAll() { + // For each node in the ordering + for (unsigned i = 0, N = Ordering.size(); i < N; i++) { + // Get the scheduling info + NodeInfo *NI = Ordering[i]; + if (NI->isInGroup()) { + NodeGroupIterator NGI(Ordering[i]); + while (NodeInfo *NI = NGI.next()) EmitNode(NI); + } else { + EmitNode(NI); + } + } + } + + /// Schedule - Order nodes according to selected style. + /// + void ScheduleDAGSimple::Schedule() { + // Number the nodes + NodeCount = std::distance(DAG.allnodes_begin(), DAG.allnodes_end()); + // Test to see if scheduling should occur + bool ShouldSchedule = NodeCount > 3 && ScheduleStyle != noScheduling; + // Set up minimum info for scheduling + PrepareNodeInfo(); + // Construct node groups for flagged nodes + IdentifyGroups(); + + // Don't waste time if is only entry and return + if (ShouldSchedule) { + // Get latency and resource requirements + GatherSchedulingInfo(); + } else if (HasGroups) { + // Make sure all the groups have dominators + FakeGroupDominators(); + } + + // Breadth first walk of DAG + VisitAll(); + + #ifndef NDEBUG + static unsigned Count = 0; + Count++; + for (unsigned i = 0, N = Ordering.size(); i < N; i++) { + NodeInfo *NI = Ordering[i]; + NI->Preorder = i; + } + #endif + + // Don't waste time if is only entry and return + if (ShouldSchedule) { + // Push back long instructions and critical path + ScheduleBackward(); + + // Pack instructions to maximize resource utilization + ScheduleForward(); + } + + DEBUG(printChanges(Count)); + + // Emit in scheduled order + EmitAll(); + } + + /// printChanges - Hilight changes in order caused by scheduling. + /// + void ScheduleDAGSimple::printChanges(unsigned Index) { + #ifndef NDEBUG + // Get the ordered node count + unsigned N = Ordering.size(); + // Determine if any changes + unsigned i = 0; + for (; i < N; i++) { + NodeInfo *NI = Ordering[i]; + if (NI->Preorder != i) break; + } + + if (i < N) { + std::cerr << Index << ". New Ordering\n"; + + for (i = 0; i < N; i++) { + NodeInfo *NI = Ordering[i]; + std::cerr << " " << NI->Preorder << ". "; + printSI(std::cerr, NI); + std::cerr << "\n"; + if (NI->isGroupDominator()) { + NodeGroup *Group = NI->Group; + for (NIIterator NII = Group->group_begin(), E = Group->group_end(); + NII != E; NII++) { + std::cerr << " "; + printSI(std::cerr, *NII); + std::cerr << "\n"; + } + } + } + } else { + std::cerr << Index << ". No Changes\n"; + } + #endif + } + + /// printSI - Print schedule info. + /// + void ScheduleDAGSimple::printSI(std::ostream &O, NodeInfo *NI) const { + #ifndef NDEBUG + SDNode *Node = NI->Node; + O << " " + << std::hex << Node << std::dec + << ", Lat=" << NI->Latency + << ", Slot=" << NI->Slot + << ", ARITY=(" << Node->getNumOperands() << "," + << Node->getNumValues() << ")" + << " " << Node->getOperationName(&DAG); + if (isFlagDefiner(Node)) O << "<#"; + if (isFlagUser(Node)) O << ">#"; + #endif + } + + /// print - Print ordering to specified output stream. + /// + void ScheduleDAGSimple::print(std::ostream &O) const { + #ifndef NDEBUG + using namespace std; + O << "Ordering\n"; + for (unsigned i = 0, N = Ordering.size(); i < N; i++) { + NodeInfo *NI = Ordering[i]; + printSI(O, NI); + O << "\n"; + if (NI->isGroupDominator()) { + NodeGroup *Group = NI->Group; + for (NIIterator NII = Group->group_begin(), E = Group->group_end(); + NII != E; NII++) { + O << " "; + printSI(O, *NII); + O << "\n"; + } + } + } + #endif + } + + /// createSimpleDAGScheduler - This creates a simple two pass instruction + /// scheduler. + llvm::ScheduleDAG* llvm::createSimpleDAGScheduler(SelectionDAG &DAG, + MachineBasicBlock *BB) { + return new ScheduleDAGSimple(DAG, BB, DAG.getTarget()); + } Index: llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.55 llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.56 --- llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp:1.55 Wed Dec 28 23:59:19 2005 +++ llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Fri Jan 20 20:32:06 2006 @@ -1,4 +1,4 @@ -//===-- ScheduleDAG.cpp - Implement a trivial DAG scheduler ---------------===// +//===---- ScheduleDAG.cpp - Implement the ScheduleDAG class ---------------===// // // The LLVM Compiler Infrastructure // @@ -16,1002 +16,21 @@ #define DEBUG_TYPE "sched" #include "llvm/CodeGen/MachineConstantPool.h" #include "llvm/CodeGen/MachineFunction.h" -#include "llvm/CodeGen/SelectionDAGISel.h" -#include "llvm/CodeGen/SelectionDAG.h" +#include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetInstrItineraries.h" #include "llvm/Target/TargetLowering.h" -#include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include -#include -#include using namespace llvm; -namespace { - // Style of scheduling to use. - enum ScheduleChoices { - noScheduling, - simpleScheduling, - simpleNoItinScheduling - }; -} // namespace - -cl::opt ScheduleStyle("sched", - cl::desc("Choose scheduling style"), - cl::init(noScheduling), - cl::values( - clEnumValN(noScheduling, "none", - "Trivial emission with no analysis"), - clEnumValN(simpleScheduling, "simple", - "Minimize critical path and maximize processor utilization"), - clEnumValN(simpleNoItinScheduling, "simple-noitin", - "Same as simple except using generic latency"), - clEnumValEnd)); - - -#ifndef NDEBUG -static cl::opt -ViewDAGs("view-sched-dags", cl::Hidden, - cl::desc("Pop up a window to show sched dags as they are processed")); -#else -static const bool ViewDAGs = 0; -#endif - -namespace { -//===----------------------------------------------------------------------===// -/// -/// BitsIterator - Provides iteration through individual bits in a bit vector. -/// -template -class BitsIterator { -private: - T Bits; // Bits left to iterate through - -public: - /// Ctor. - BitsIterator(T Initial) : Bits(Initial) {} - - /// Next - Returns the next bit set or zero if exhausted. - inline T Next() { - // Get the rightmost bit set - T Result = Bits & -Bits; - // Remove from rest - Bits &= ~Result; - // Return single bit or zero - return Result; - } -}; - -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// -/// ResourceTally - Manages the use of resources over time intervals. Each -/// item (slot) in the tally vector represents the resources used at a given -/// moment. A bit set to 1 indicates that a resource is in use, otherwise -/// available. An assumption is made that the tally is large enough to schedule -/// all current instructions (asserts otherwise.) -/// -template -class ResourceTally { -private: - std::vector Tally; // Resources used per slot - typedef typename std::vector::iterator Iter; - // Tally iterator - - /// SlotsAvailable - Returns true if all units are available. - /// - bool SlotsAvailable(Iter Begin, unsigned N, unsigned ResourceSet, - unsigned &Resource) { - assert(N && "Must check availability with N != 0"); - // Determine end of interval - Iter End = Begin + N; - assert(End <= Tally.end() && "Tally is not large enough for schedule"); - - // Iterate thru each resource - BitsIterator Resources(ResourceSet & ~*Begin); - while (unsigned Res = Resources.Next()) { - // Check if resource is available for next N slots - Iter Interval = End; - do { - Interval--; - if (*Interval & Res) break; - } while (Interval != Begin); - - // If available for N - if (Interval == Begin) { - // Success - Resource = Res; - return true; - } - } - - // No luck - Resource = 0; - return false; - } - - /// RetrySlot - Finds a good candidate slot to retry search. - Iter RetrySlot(Iter Begin, unsigned N, unsigned ResourceSet) { - assert(N && "Must check availability with N != 0"); - // Determine end of interval - Iter End = Begin + N; - assert(End <= Tally.end() && "Tally is not large enough for schedule"); - - while (Begin != End--) { - // Clear units in use - ResourceSet &= ~*End; - // If no units left then we should go no further - if (!ResourceSet) return End + 1; - } - // Made it all the way through - return Begin; - } - - /// FindAndReserveStages - Return true if the stages can be completed. If - /// so mark as busy. - bool FindAndReserveStages(Iter Begin, - InstrStage *Stage, InstrStage *StageEnd) { - // If at last stage then we're done - if (Stage == StageEnd) return true; - // Get number of cycles for current stage - unsigned N = Stage->Cycles; - // Check to see if N slots are available, if not fail - unsigned Resource; - if (!SlotsAvailable(Begin, N, Stage->Units, Resource)) return false; - // Check to see if remaining stages are available, if not fail - if (!FindAndReserveStages(Begin + N, Stage + 1, StageEnd)) return false; - // Reserve resource - Reserve(Begin, N, Resource); - // Success - return true; - } - - /// Reserve - Mark busy (set) the specified N slots. - void Reserve(Iter Begin, unsigned N, unsigned Resource) { - // Determine end of interval - Iter End = Begin + N; - assert(End <= Tally.end() && "Tally is not large enough for schedule"); - - // Set resource bit in each slot - for (; Begin < End; Begin++) - *Begin |= Resource; - } - - /// FindSlots - Starting from Begin, locate consecutive slots where all stages - /// can be completed. Returns the address of first slot. - Iter FindSlots(Iter Begin, InstrStage *StageBegin, InstrStage *StageEnd) { - // Track position - Iter Cursor = Begin; - - // Try all possible slots forward - while (true) { - // Try at cursor, if successful return position. - if (FindAndReserveStages(Cursor, StageBegin, StageEnd)) return Cursor; - // Locate a better position - Cursor = RetrySlot(Cursor + 1, StageBegin->Cycles, StageBegin->Units); - } - } - -public: - /// Initialize - Resize and zero the tally to the specified number of time - /// slots. - inline void Initialize(unsigned N) { - Tally.assign(N, 0); // Initialize tally to all zeros. - } - - // FindAndReserve - Locate an ideal slot for the specified stages and mark - // as busy. - unsigned FindAndReserve(unsigned Slot, InstrStage *StageBegin, - InstrStage *StageEnd) { - // Where to begin - Iter Begin = Tally.begin() + Slot; - // Find a free slot - Iter Where = FindSlots(Begin, StageBegin, StageEnd); - // Distance is slot number - unsigned Final = Where - Tally.begin(); - return Final; - } - -}; -//===----------------------------------------------------------------------===// - -// Forward -class NodeInfo; -typedef NodeInfo *NodeInfoPtr; -typedef std::vector NIVector; -typedef std::vector::iterator NIIterator; - -//===----------------------------------------------------------------------===// -/// -/// Node group - This struct is used to manage flagged node groups. -/// -class NodeGroup { -private: - NIVector Members; // Group member nodes - NodeInfo *Dominator; // Node with highest latency - unsigned Latency; // Total latency of the group - int Pending; // Number of visits pending before - // adding to order - -public: - // Ctor. - NodeGroup() : Dominator(NULL), Pending(0) {} - - // Accessors - inline void setDominator(NodeInfo *D) { Dominator = D; } - inline NodeInfo *getDominator() { return Dominator; } - inline void setLatency(unsigned L) { Latency = L; } - inline unsigned getLatency() { return Latency; } - inline int getPending() const { return Pending; } - inline void setPending(int P) { Pending = P; } - inline int addPending(int I) { return Pending += I; } - - // Pass thru - inline bool group_empty() { return Members.empty(); } - inline NIIterator group_begin() { return Members.begin(); } - inline NIIterator group_end() { return Members.end(); } - inline void group_push_back(const NodeInfoPtr &NI) { Members.push_back(NI); } - inline NIIterator group_insert(NIIterator Pos, const NodeInfoPtr &NI) { - return Members.insert(Pos, NI); - } - inline void group_insert(NIIterator Pos, NIIterator First, NIIterator Last) { - Members.insert(Pos, First, Last); - } - - static void Add(NodeInfo *D, NodeInfo *U); - static unsigned CountInternalUses(NodeInfo *D, NodeInfo *U); -}; -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// -/// NodeInfo - This struct tracks information used to schedule the a node. -/// -class NodeInfo { -private: - int Pending; // Number of visits pending before - // adding to order -public: - SDNode *Node; // DAG node - InstrStage *StageBegin; // First stage in itinerary - InstrStage *StageEnd; // Last+1 stage in itinerary - unsigned Latency; // Total cycles to complete instruction - bool IsCall : 1; // Is function call - bool IsLoad : 1; // Is memory load - bool IsStore : 1; // Is memory store - unsigned Slot; // Node's time slot - NodeGroup *Group; // Grouping information - unsigned VRBase; // Virtual register base -#ifndef NDEBUG - unsigned Preorder; // Index before scheduling -#endif - - // Ctor. - NodeInfo(SDNode *N = NULL) - : Pending(0) - , Node(N) - , StageBegin(NULL) - , StageEnd(NULL) - , Latency(0) - , IsCall(false) - , Slot(0) - , Group(NULL) - , VRBase(0) -#ifndef NDEBUG - , Preorder(0) -#endif - {} - - // Accessors - inline bool isInGroup() const { - assert(!Group || !Group->group_empty() && "Group with no members"); - return Group != NULL; - } - inline bool isGroupDominator() const { - return isInGroup() && Group->getDominator() == this; - } - inline int getPending() const { - return Group ? Group->getPending() : Pending; - } - inline void setPending(int P) { - if (Group) Group->setPending(P); - else Pending = P; - } - inline int addPending(int I) { - if (Group) return Group->addPending(I); - else return Pending += I; - } -}; -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// -/// NodeGroupIterator - Iterates over all the nodes indicated by the node info. -/// If the node is in a group then iterate over the members of the group, -/// otherwise just the node info. -/// -class NodeGroupIterator { -private: - NodeInfo *NI; // Node info - NIIterator NGI; // Node group iterator - NIIterator NGE; // Node group iterator end - -public: - // Ctor. - NodeGroupIterator(NodeInfo *N) : NI(N) { - // If the node is in a group then set up the group iterator. Otherwise - // the group iterators will trip first time out. - if (N->isInGroup()) { - // get Group - NodeGroup *Group = NI->Group; - NGI = Group->group_begin(); - NGE = Group->group_end(); - // Prevent this node from being used (will be in members list - NI = NULL; - } - } - - /// next - Return the next node info, otherwise NULL. - /// - NodeInfo *next() { - // If members list - if (NGI != NGE) return *NGI++; - // Use node as the result (may be NULL) - NodeInfo *Result = NI; - // Only use once - NI = NULL; - // Return node or NULL - return Result; - } -}; -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// -/// NodeGroupOpIterator - Iterates over all the operands of a node. If the node -/// is a member of a group, this iterates over all the operands of all the -/// members of the group. -/// -class NodeGroupOpIterator { -private: - NodeInfo *NI; // Node containing operands - NodeGroupIterator GI; // Node group iterator - SDNode::op_iterator OI; // Operand iterator - SDNode::op_iterator OE; // Operand iterator end - - /// CheckNode - Test if node has more operands. If not get the next node - /// skipping over nodes that have no operands. - void CheckNode() { - // Only if operands are exhausted first - while (OI == OE) { - // Get next node info - NodeInfo *NI = GI.next(); - // Exit if nodes are exhausted - if (!NI) return; - // Get node itself - SDNode *Node = NI->Node; - // Set up the operand iterators - OI = Node->op_begin(); - OE = Node->op_end(); - } - } - -public: - // Ctor. - NodeGroupOpIterator(NodeInfo *N) - : NI(N), GI(N), OI(SDNode::op_iterator()), OE(SDNode::op_iterator()) {} - - /// isEnd - Returns true when not more operands are available. - /// - inline bool isEnd() { CheckNode(); return OI == OE; } - - /// next - Returns the next available operand. - /// - inline SDOperand next() { - assert(OI != OE && "Not checking for end of NodeGroupOpIterator correctly"); - return *OI++; - } -}; -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// -/// SimpleSched - Simple two pass scheduler. -/// -class SimpleSched { -private: - MachineBasicBlock *BB; // Current basic block - SelectionDAG &DAG; // DAG of the current basic block - const TargetMachine &TM; // Target processor - const TargetInstrInfo &TII; // Target instruction information - const MRegisterInfo &MRI; // Target processor register information - SSARegMap *RegMap; // Virtual/real register map - MachineConstantPool *ConstPool; // Target constant pool - unsigned NodeCount; // Number of nodes in DAG - bool HasGroups; // True if there are any groups - NodeInfo *Info; // Info for nodes being scheduled - std::map Map; // Map nodes to info - NIVector Ordering; // Emit ordering of nodes - ResourceTally Tally; // Resource usage tally - unsigned NSlots; // Total latency - static const unsigned NotFound = ~0U; // Search marker - -public: - - // Ctor. - SimpleSched(SelectionDAG &D, MachineBasicBlock *bb) - : BB(bb), DAG(D), TM(D.getTarget()), TII(*TM.getInstrInfo()), - MRI(*TM.getRegisterInfo()), RegMap(BB->getParent()->getSSARegMap()), - ConstPool(BB->getParent()->getConstantPool()), - NodeCount(0), HasGroups(false), Info(NULL), Map(), Tally(), NSlots(0) { - assert(&TII && "Target doesn't provide instr info?"); - assert(&MRI && "Target doesn't provide register info?"); - } - - // Run - perform scheduling. - MachineBasicBlock *Run() { - Schedule(); - return BB; - } - -private: - /// getNI - Returns the node info for the specified node. - /// - inline NodeInfo *getNI(SDNode *Node) { return Map[Node]; } - - /// getVR - Returns the virtual register number of the node. - /// - inline unsigned getVR(SDOperand Op) { - NodeInfo *NI = getNI(Op.Val); - assert(NI->VRBase != 0 && "Node emitted out of order - late"); - return NI->VRBase + Op.ResNo; - } - - static bool isFlagDefiner(SDNode *A); - static bool isFlagUser(SDNode *A); - static bool isDefiner(NodeInfo *A, NodeInfo *B); - static bool isPassiveNode(SDNode *Node); - void IncludeNode(NodeInfo *NI); - void VisitAll(); - void Schedule(); - void IdentifyGroups(); - void GatherSchedulingInfo(); - void FakeGroupDominators(); - void PrepareNodeInfo(); - bool isStrongDependency(NodeInfo *A, NodeInfo *B); - bool isWeakDependency(NodeInfo *A, NodeInfo *B); - void ScheduleBackward(); - void ScheduleForward(); - void EmitAll(); - void EmitNode(NodeInfo *NI); - static unsigned CountResults(SDNode *Node); - static unsigned CountOperands(SDNode *Node); - unsigned CreateVirtualRegisters(MachineInstr *MI, - unsigned NumResults, - const TargetInstrDescriptor &II); - - void printChanges(unsigned Index); - void printSI(std::ostream &O, NodeInfo *NI) const; - void print(std::ostream &O) const; - inline void dump(const char *tag) const { std::cerr << tag; dump(); } - void dump() const; -}; - - -//===----------------------------------------------------------------------===// -/// Special case itineraries. -/// -enum { - CallLatency = 40, // To push calls back in time - - RSInteger = 0xC0000000, // Two integer units - RSFloat = 0x30000000, // Two float units - RSLoadStore = 0x0C000000, // Two load store units - RSBranch = 0x02000000 // One branch unit -}; -static InstrStage CallStage = { CallLatency, RSBranch }; -static InstrStage LoadStage = { 5, RSLoadStore }; -static InstrStage StoreStage = { 2, RSLoadStore }; -static InstrStage IntStage = { 2, RSInteger }; -static InstrStage FloatStage = { 3, RSFloat }; -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// - -} // namespace - -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// Add - Adds a definer and user pair to a node group. -/// -void NodeGroup::Add(NodeInfo *D, NodeInfo *U) { - // Get current groups - NodeGroup *DGroup = D->Group; - NodeGroup *UGroup = U->Group; - // If both are members of groups - if (DGroup && UGroup) { - // There may have been another edge connecting - if (DGroup == UGroup) return; - // Add the pending users count - DGroup->addPending(UGroup->getPending()); - // For each member of the users group - NodeGroupIterator UNGI(U); - while (NodeInfo *UNI = UNGI.next() ) { - // Change the group - UNI->Group = DGroup; - // For each member of the definers group - NodeGroupIterator DNGI(D); - while (NodeInfo *DNI = DNGI.next() ) { - // Remove internal edges - DGroup->addPending(-CountInternalUses(DNI, UNI)); - } - } - // Merge the two lists - DGroup->group_insert(DGroup->group_end(), - UGroup->group_begin(), UGroup->group_end()); - } else if (DGroup) { - // Make user member of definers group - U->Group = DGroup; - // Add users uses to definers group pending - DGroup->addPending(U->Node->use_size()); - // For each member of the definers group - NodeGroupIterator DNGI(D); - while (NodeInfo *DNI = DNGI.next() ) { - // Remove internal edges - DGroup->addPending(-CountInternalUses(DNI, U)); - } - DGroup->group_push_back(U); - } else if (UGroup) { - // Make definer member of users group - D->Group = UGroup; - // Add definers uses to users group pending - UGroup->addPending(D->Node->use_size()); - // For each member of the users group - NodeGroupIterator UNGI(U); - while (NodeInfo *UNI = UNGI.next() ) { - // Remove internal edges - UGroup->addPending(-CountInternalUses(D, UNI)); - } - UGroup->group_insert(UGroup->group_begin(), D); - } else { - D->Group = U->Group = DGroup = new NodeGroup(); - DGroup->addPending(D->Node->use_size() + U->Node->use_size() - - CountInternalUses(D, U)); - DGroup->group_push_back(D); - DGroup->group_push_back(U); - } -} - -/// CountInternalUses - Returns the number of edges between the two nodes. -/// -unsigned NodeGroup::CountInternalUses(NodeInfo *D, NodeInfo *U) { - unsigned N = 0; - for (unsigned M = U->Node->getNumOperands(); 0 < M--;) { - SDOperand Op = U->Node->getOperand(M); - if (Op.Val == D->Node) N++; - } - - return N; -} -//===----------------------------------------------------------------------===// - - -//===----------------------------------------------------------------------===// -/// isFlagDefiner - Returns true if the node defines a flag result. -bool SimpleSched::isFlagDefiner(SDNode *A) { - unsigned N = A->getNumValues(); - return N && A->getValueType(N - 1) == MVT::Flag; -} - -/// isFlagUser - Returns true if the node uses a flag result. -/// -bool SimpleSched::isFlagUser(SDNode *A) { - unsigned N = A->getNumOperands(); - return N && A->getOperand(N - 1).getValueType() == MVT::Flag; -} - -/// isDefiner - Return true if node A is a definer for B. -/// -bool SimpleSched::isDefiner(NodeInfo *A, NodeInfo *B) { - // While there are A nodes - NodeGroupIterator NII(A); - while (NodeInfo *NI = NII.next()) { - // Extract node - SDNode *Node = NI->Node; - // While there operands in nodes of B - NodeGroupOpIterator NGOI(B); - while (!NGOI.isEnd()) { - SDOperand Op = NGOI.next(); - // If node from A defines a node in B - if (Node == Op.Val) return true; - } - } - return false; -} - -/// isPassiveNode - Return true if the node is a non-scheduled leaf. -/// -bool SimpleSched::isPassiveNode(SDNode *Node) { - if (isa(Node)) return true; - if (isa(Node)) return true; - if (isa(Node)) return true; - if (isa(Node)) return true; - if (isa(Node)) return true; - if (isa(Node)) return true; - if (isa(Node)) return true; - return false; -} - -/// IncludeNode - Add node to NodeInfo vector. -/// -void SimpleSched::IncludeNode(NodeInfo *NI) { - // Get node - SDNode *Node = NI->Node; - // Ignore entry node - if (Node->getOpcode() == ISD::EntryToken) return; - // Check current count for node - int Count = NI->getPending(); - // If the node is already in list - if (Count < 0) return; - // Decrement count to indicate a visit - Count--; - // If count has gone to zero then add node to list - if (!Count) { - // Add node - if (NI->isInGroup()) { - Ordering.push_back(NI->Group->getDominator()); - } else { - Ordering.push_back(NI); - } - // indicate node has been added - Count--; - } - // Mark as visited with new count - NI->setPending(Count); -} - -/// VisitAll - Visit each node breadth-wise to produce an initial ordering. -/// Note that the ordering in the Nodes vector is reversed. -void SimpleSched::VisitAll() { - // Add first element to list - NodeInfo *NI = getNI(DAG.getRoot().Val); - if (NI->isInGroup()) { - Ordering.push_back(NI->Group->getDominator()); - } else { - Ordering.push_back(NI); - } - - // Iterate through all nodes that have been added - for (unsigned i = 0; i < Ordering.size(); i++) { // note: size() varies - // Visit all operands - NodeGroupOpIterator NGI(Ordering[i]); - while (!NGI.isEnd()) { - // Get next operand - SDOperand Op = NGI.next(); - // Get node - SDNode *Node = Op.Val; - // Ignore passive nodes - if (isPassiveNode(Node)) continue; - // Check out node - IncludeNode(getNI(Node)); - } - } - - // Add entry node last (IncludeNode filters entry nodes) - if (DAG.getEntryNode().Val != DAG.getRoot().Val) - Ordering.push_back(getNI(DAG.getEntryNode().Val)); - - // Reverse the order - std::reverse(Ordering.begin(), Ordering.end()); -} - -/// IdentifyGroups - Put flagged nodes into groups. -/// -void SimpleSched::IdentifyGroups() { - for (unsigned i = 0, N = NodeCount; i < N; i++) { - NodeInfo* NI = &Info[i]; - SDNode *Node = NI->Node; - - // For each operand (in reverse to only look at flags) - for (unsigned N = Node->getNumOperands(); 0 < N--;) { - // Get operand - SDOperand Op = Node->getOperand(N); - // No more flags to walk - if (Op.getValueType() != MVT::Flag) break; - // Add to node group - NodeGroup::Add(getNI(Op.Val), NI); - // Let evryone else know - HasGroups = true; - } - } -} - -/// GatherSchedulingInfo - Get latency and resource information about each node. -/// -void SimpleSched::GatherSchedulingInfo() { - // Get instruction itineraries for the target - const InstrItineraryData InstrItins = TM.getInstrItineraryData(); - - // For each node - for (unsigned i = 0, N = NodeCount; i < N; i++) { - // Get node info - NodeInfo* NI = &Info[i]; - SDNode *Node = NI->Node; - - // If there are itineraries and it is a machine instruction - if (InstrItins.isEmpty() || ScheduleStyle == simpleNoItinScheduling) { - // If machine opcode - if (Node->isTargetOpcode()) { - // Get return type to guess which processing unit - MVT::ValueType VT = Node->getValueType(0); - // Get machine opcode - MachineOpCode TOpc = Node->getTargetOpcode(); - NI->IsCall = TII.isCall(TOpc); - NI->IsLoad = TII.isLoad(TOpc); - NI->IsStore = TII.isStore(TOpc); - - if (TII.isLoad(TOpc)) NI->StageBegin = &LoadStage; - else if (TII.isStore(TOpc)) NI->StageBegin = &StoreStage; - else if (MVT::isInteger(VT)) NI->StageBegin = &IntStage; - else if (MVT::isFloatingPoint(VT)) NI->StageBegin = &FloatStage; - if (NI->StageBegin) NI->StageEnd = NI->StageBegin + 1; - } - } else if (Node->isTargetOpcode()) { - // get machine opcode - MachineOpCode TOpc = Node->getTargetOpcode(); - // Check to see if it is a call - NI->IsCall = TII.isCall(TOpc); - // Get itinerary stages for instruction - unsigned II = TII.getSchedClass(TOpc); - NI->StageBegin = InstrItins.begin(II); - NI->StageEnd = InstrItins.end(II); - } - - // One slot for the instruction itself - NI->Latency = 1; - - // Add long latency for a call to push it back in time - if (NI->IsCall) NI->Latency += CallLatency; - - // Sum up all the latencies - for (InstrStage *Stage = NI->StageBegin, *E = NI->StageEnd; - Stage != E; Stage++) { - NI->Latency += Stage->Cycles; - } - - // Sum up all the latencies for max tally size - NSlots += NI->Latency; - } - - // Unify metrics if in a group - if (HasGroups) { - for (unsigned i = 0, N = NodeCount; i < N; i++) { - NodeInfo* NI = &Info[i]; - - if (NI->isInGroup()) { - NodeGroup *Group = NI->Group; - - if (!Group->getDominator()) { - NIIterator NGI = Group->group_begin(), NGE = Group->group_end(); - NodeInfo *Dominator = *NGI; - unsigned Latency = 0; - - for (NGI++; NGI != NGE; NGI++) { - NodeInfo* NGNI = *NGI; - Latency += NGNI->Latency; - if (Dominator->Latency < NGNI->Latency) Dominator = NGNI; - } - - Dominator->Latency = Latency; - Group->setDominator(Dominator); - } - } - } - } -} - -/// FakeGroupDominators - Set dominators for non-scheduling. -/// -void SimpleSched::FakeGroupDominators() { - for (unsigned i = 0, N = NodeCount; i < N; i++) { - NodeInfo* NI = &Info[i]; - - if (NI->isInGroup()) { - NodeGroup *Group = NI->Group; - - if (!Group->getDominator()) { - Group->setDominator(NI); - } - } - } -} - -/// PrepareNodeInfo - Set up the basic minimum node info for scheduling. -/// -void SimpleSched::PrepareNodeInfo() { - // Allocate node information - Info = new NodeInfo[NodeCount]; - - unsigned i = 0; - for (SelectionDAG::allnodes_iterator I = DAG.allnodes_begin(), - E = DAG.allnodes_end(); I != E; ++I, ++i) { - // Fast reference to node schedule info - NodeInfo* NI = &Info[i]; - // Set up map - Map[I] = NI; - // Set node - NI->Node = I; - // Set pending visit count - NI->setPending(I->use_size()); - } -} - -/// isStrongDependency - Return true if node A has results used by node B. -/// I.E., B must wait for latency of A. -bool SimpleSched::isStrongDependency(NodeInfo *A, NodeInfo *B) { - // If A defines for B then it's a strong dependency or - // if a load follows a store (may be dependent but why take a chance.) - return isDefiner(A, B) || (A->IsStore && B->IsLoad); -} - -/// isWeakDependency Return true if node A produces a result that will -/// conflict with operands of B. It is assumed that we have called -/// isStrongDependency prior. -bool SimpleSched::isWeakDependency(NodeInfo *A, NodeInfo *B) { - // TODO check for conflicting real registers and aliases -#if 0 // FIXME - Since we are in SSA form and not checking register aliasing - return A->Node->getOpcode() == ISD::EntryToken || isStrongDependency(B, A); -#else - return A->Node->getOpcode() == ISD::EntryToken; -#endif -} - -/// ScheduleBackward - Schedule instructions so that any long latency -/// instructions and the critical path get pushed back in time. Time is run in -/// reverse to allow code reuse of the Tally and eliminate the overhead of -/// biasing every slot indices against NSlots. -void SimpleSched::ScheduleBackward() { - // Size and clear the resource tally - Tally.Initialize(NSlots); - // Get number of nodes to schedule - unsigned N = Ordering.size(); - - // For each node being scheduled - for (unsigned i = N; 0 < i--;) { - NodeInfo *NI = Ordering[i]; - // Track insertion - unsigned Slot = NotFound; - - // Compare against those previously scheduled nodes - unsigned j = i + 1; - for (; j < N; j++) { - // Get following instruction - NodeInfo *Other = Ordering[j]; - - // Check dependency against previously inserted nodes - if (isStrongDependency(NI, Other)) { - Slot = Other->Slot + Other->Latency; - break; - } else if (isWeakDependency(NI, Other)) { - Slot = Other->Slot; - break; - } - } - - // If independent of others (or first entry) - if (Slot == NotFound) Slot = 0; - -#if 0 // FIXME - measure later - // Find a slot where the needed resources are available - if (NI->StageBegin != NI->StageEnd) - Slot = Tally.FindAndReserve(Slot, NI->StageBegin, NI->StageEnd); -#endif - - // Set node slot - NI->Slot = Slot; - - // Insert sort based on slot - j = i + 1; - for (; j < N; j++) { - // Get following instruction - NodeInfo *Other = Ordering[j]; - // Should we look further (remember slots are in reverse time) - if (Slot >= Other->Slot) break; - // Shuffle other into ordering - Ordering[j - 1] = Other; - } - // Insert node in proper slot - if (j != i + 1) Ordering[j - 1] = NI; - } -} - -/// ScheduleForward - Schedule instructions to maximize packing. -/// -void SimpleSched::ScheduleForward() { - // Size and clear the resource tally - Tally.Initialize(NSlots); - // Get number of nodes to schedule - unsigned N = Ordering.size(); - - // For each node being scheduled - for (unsigned i = 0; i < N; i++) { - NodeInfo *NI = Ordering[i]; - // Track insertion - unsigned Slot = NotFound; - - // Compare against those previously scheduled nodes - unsigned j = i; - for (; 0 < j--;) { - // Get following instruction - NodeInfo *Other = Ordering[j]; - - // Check dependency against previously inserted nodes - if (isStrongDependency(Other, NI)) { - Slot = Other->Slot + Other->Latency; - break; - } else if (Other->IsCall || isWeakDependency(Other, NI)) { - Slot = Other->Slot; - break; - } - } - - // If independent of others (or first entry) - if (Slot == NotFound) Slot = 0; - - // Find a slot where the needed resources are available - if (NI->StageBegin != NI->StageEnd) - Slot = Tally.FindAndReserve(Slot, NI->StageBegin, NI->StageEnd); - - // Set node slot - NI->Slot = Slot; - - // Insert sort based on slot - j = i; - for (; 0 < j--;) { - // Get prior instruction - NodeInfo *Other = Ordering[j]; - // Should we look further - if (Slot >= Other->Slot) break; - // Shuffle other into ordering - Ordering[j + 1] = Other; - } - // Insert node in proper slot - if (j != i) Ordering[j + 1] = NI; - } -} - -/// EmitAll - Emit all nodes in schedule sorted order. -/// -void SimpleSched::EmitAll() { - // For each node in the ordering - for (unsigned i = 0, N = Ordering.size(); i < N; i++) { - // Get the scheduling info - NodeInfo *NI = Ordering[i]; - if (NI->isInGroup()) { - NodeGroupIterator NGI(Ordering[i]); - while (NodeInfo *NI = NGI.next()) EmitNode(NI); - } else { - EmitNode(NI); - } - } -} /// CountResults - The results of target nodes have register or immediate /// operands first, then an optional chain, and optional flag operands (which do /// not go into the machine instrs.) -unsigned SimpleSched::CountResults(SDNode *Node) { +static unsigned CountResults(SDNode *Node) { unsigned N = Node->getNumValues(); while (N && Node->getValueType(N - 1) == MVT::Flag) --N; @@ -1023,7 +42,7 @@ /// CountOperands The inputs to target nodes have any actual inputs first, /// followed by an optional chain operand, then flag operands. Compute the /// number of actual operands that will go into the machine instr. -unsigned SimpleSched::CountOperands(SDNode *Node) { +static unsigned CountOperands(SDNode *Node) { unsigned N = Node->getNumOperands(); while (N && Node->getOperand(N - 1).getValueType() == MVT::Flag) --N; @@ -1034,7 +53,7 @@ /// CreateVirtualRegisters - Add result register values for things that are /// defined by this instruction. -unsigned SimpleSched::CreateVirtualRegisters(MachineInstr *MI, +unsigned ScheduleDAG::CreateVirtualRegisters(MachineInstr *MI, unsigned NumResults, const TargetInstrDescriptor &II) { // Create the result registers for this node and add the result regs to @@ -1052,14 +71,14 @@ /// EmitNode - Generate machine code for an node and needed dependencies. /// -void SimpleSched::EmitNode(NodeInfo *NI) { +void ScheduleDAG::EmitNode(NodeInfo *NI) { unsigned VRBase = 0; // First virtual register for node SDNode *Node = NI->Node; // If machine instruction if (Node->isTargetOpcode()) { unsigned Opc = Node->getTargetOpcode(); - const TargetInstrDescriptor &II = TII.get(Opc); + const TargetInstrDescriptor &II = TII->get(Opc); unsigned NumResults = CountResults(Node); unsigned NodeOperands = CountOperands(Node); @@ -1176,8 +195,8 @@ unsigned InReg = getVR(Node->getOperand(2)); unsigned DestReg = cast(Node->getOperand(1))->getReg(); if (InReg != DestReg) // Coallesced away the copy? - MRI.copyRegToReg(*BB, BB->end(), DestReg, InReg, - RegMap->getRegClass(InReg)); + MRI->copyRegToReg(*BB, BB->end(), DestReg, InReg, + RegMap->getRegClass(InReg)); break; } case ISD::CopyFromReg: { @@ -1209,8 +228,8 @@ } else { // Pick the register class of the right type that contains this physreg. - for (MRegisterInfo::regclass_iterator I = MRI.regclass_begin(), - E = MRI.regclass_end(); I != E; ++I) + for (MRegisterInfo::regclass_iterator I = MRI->regclass_begin(), + E = MRI->regclass_end(); I != E; ++I) if ((*I)->hasType(Node->getValueType(0)) && (*I)->contains(SrcReg)) { TRC = *I; @@ -1221,7 +240,7 @@ // Create the reg, emit the copy. VRBase = RegMap->createVirtualRegister(TRC); } - MRI.copyRegToReg(*BB, BB->end(), VRBase, SrcReg, TRC); + MRI->copyRegToReg(*BB, BB->end(), VRBase, SrcReg, TRC); break; } } @@ -1231,143 +250,21 @@ NI->VRBase = VRBase; } -/// Schedule - Order nodes according to selected style. -/// -void SimpleSched::Schedule() { - // Number the nodes - NodeCount = std::distance(DAG.allnodes_begin(), DAG.allnodes_end()); - // Test to see if scheduling should occur - bool ShouldSchedule = NodeCount > 3 && ScheduleStyle != noScheduling; - // Set up minimum info for scheduling - PrepareNodeInfo(); - // Construct node groups for flagged nodes - IdentifyGroups(); - - // Don't waste time if is only entry and return - if (ShouldSchedule) { - // Get latency and resource requirements - GatherSchedulingInfo(); - } else if (HasGroups) { - // Make sure all the groups have dominators - FakeGroupDominators(); - } - - // Breadth first walk of DAG - VisitAll(); - -#ifndef NDEBUG - static unsigned Count = 0; - Count++; - for (unsigned i = 0, N = Ordering.size(); i < N; i++) { - NodeInfo *NI = Ordering[i]; - NI->Preorder = i; - } -#endif - - // Don't waste time if is only entry and return - if (ShouldSchedule) { - // Push back long instructions and critical path - ScheduleBackward(); - - // Pack instructions to maximize resource utilization - ScheduleForward(); - } - - DEBUG(printChanges(Count)); - - // Emit in scheduled order - EmitAll(); -} - -/// printChanges - Hilight changes in order caused by scheduling. -/// -void SimpleSched::printChanges(unsigned Index) { -#ifndef NDEBUG - // Get the ordered node count - unsigned N = Ordering.size(); - // Determine if any changes - unsigned i = 0; - for (; i < N; i++) { - NodeInfo *NI = Ordering[i]; - if (NI->Preorder != i) break; - } - - if (i < N) { - std::cerr << Index << ". New Ordering\n"; - - for (i = 0; i < N; i++) { - NodeInfo *NI = Ordering[i]; - std::cerr << " " << NI->Preorder << ". "; - printSI(std::cerr, NI); - std::cerr << "\n"; - if (NI->isGroupDominator()) { - NodeGroup *Group = NI->Group; - for (NIIterator NII = Group->group_begin(), E = Group->group_end(); - NII != E; NII++) { - std::cerr << " "; - printSI(std::cerr, *NII); - std::cerr << "\n"; - } - } - } - } else { - std::cerr << Index << ". No Changes\n"; - } -#endif -} - -/// printSI - Print schedule info. -/// -void SimpleSched::printSI(std::ostream &O, NodeInfo *NI) const { -#ifndef NDEBUG - SDNode *Node = NI->Node; - O << " " - << std::hex << Node << std::dec - << ", Lat=" << NI->Latency - << ", Slot=" << NI->Slot - << ", ARITY=(" << Node->getNumOperands() << "," - << Node->getNumValues() << ")" - << " " << Node->getOperationName(&DAG); - if (isFlagDefiner(Node)) O << "<#"; - if (isFlagUser(Node)) O << ">#"; -#endif -} - -/// print - Print ordering to specified output stream. -/// -void SimpleSched::print(std::ostream &O) const { -#ifndef NDEBUG - using namespace std; - O << "Ordering\n"; - for (unsigned i = 0, N = Ordering.size(); i < N; i++) { - NodeInfo *NI = Ordering[i]; - printSI(O, NI); - O << "\n"; - if (NI->isGroupDominator()) { - NodeGroup *Group = NI->Group; - for (NIIterator NII = Group->group_begin(), E = Group->group_end(); - NII != E; NII++) { - O << " "; - printSI(O, *NII); - O << "\n"; - } - } - } -#endif +void ScheduleDAG::dump(const char *tag) const { + std::cerr << tag; dump(); } -/// dump - Print ordering to std::cerr. -/// -void SimpleSched::dump() const { +void ScheduleDAG::dump() const { print(std::cerr); } -//===----------------------------------------------------------------------===// - -//===----------------------------------------------------------------------===// -/// ScheduleAndEmitDAG - Pick a safe ordering and emit instructions for each -/// target node in the graph. -void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &SD) { - if (ViewDAGs) SD.viewGraph(); - BB = SimpleSched(SD, BB).Run(); +/// Run - perform scheduling. +/// +MachineBasicBlock *ScheduleDAG::Run() { + TII = TM.getInstrInfo(); + MRI = TM.getRegisterInfo(); + RegMap = BB->getParent()->getSSARegMap(); + ConstPool = BB->getParent()->getConstantPool(); + Schedule(); + return BB; } Index: llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp diff -u llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.129 llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.130 --- llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp:1.129 Fri Jan 20 12:38:32 2006 +++ llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp Fri Jan 20 20:32:06 2006 @@ -13,6 +13,7 @@ #define DEBUG_TYPE "isel" #include "llvm/CodeGen/SelectionDAGISel.h" +#include "llvm/CodeGen/ScheduleDAG.h" #include "llvm/CallingConv.h" #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" @@ -43,10 +44,14 @@ #ifndef NDEBUG static cl::opt -ViewDAGs("view-isel-dags", cl::Hidden, - cl::desc("Pop up a window to show isel dags as they are selected")); +ViewISelDAGs("view-isel-dags", cl::Hidden, + cl::desc("Pop up a window to show isel dags as they are selected")); +static cl::opt +ViewSchedDAGs("view-sched-dags", cl::Hidden, + cl::desc("Pop up a window to show sched dags as they are processed")); #else -static const bool ViewDAGs = 0; +static const bool ViewISelDAGs = 0; +static const bool ViewSchedDAGs = 0; #endif namespace llvm { @@ -1708,7 +1713,7 @@ // Run the DAG combiner in post-legalize mode. DAG.Combine(true); - if (ViewDAGs) DAG.viewGraph(); + if (ViewISelDAGs) DAG.viewGraph(); // Third, instruction select all of the operations to machine code, adding the // code to the MachineBasicBlock. @@ -1735,3 +1740,12 @@ BB->addSuccessor(Succ0MBB); } } + +//===----------------------------------------------------------------------===// +/// ScheduleAndEmitDAG - Pick a safe ordering and emit instructions for each +/// target node in the graph. +void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &DAG) { + if (ViewSchedDAGs) DAG.viewGraph(); + ScheduleDAG *SL = createSimpleDAGScheduler(DAG, BB); + SL->Run(); +} From evan.cheng at apple.com Fri Jan 20 20:55:53 2006 From: evan.cheng at apple.com (Evan Cheng) Date: Fri, 20 Jan 2006 20:55:53 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/X86/X86FloatingPoint.cpp X86ISelPattern.cpp X86InstrInfo.td Message-ID: <200601210255.UAA03929@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/X86: X86FloatingPoint.cpp updated: 1.46 -> 1.47 X86ISelPattern.cpp updated: 1.198 -> 1.199 X86InstrInfo.td updated: 1.215 -> 1.216 --- Log message: Rename fcmovae to fcmovnb and fcmova to fcmovnbe (following Intel manual). Some assemblers can't recognize the aliases. --- Diffs of the changes: (+9 -9) X86FloatingPoint.cpp | 4 ++-- X86ISelPattern.cpp | 2 +- X86InstrInfo.td | 12 ++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) Index: llvm/lib/Target/X86/X86FloatingPoint.cpp diff -u llvm/lib/Target/X86/X86FloatingPoint.cpp:1.46 llvm/lib/Target/X86/X86FloatingPoint.cpp:1.47 --- llvm/lib/Target/X86/X86FloatingPoint.cpp:1.46 Tue Jan 10 16:22:02 2006 +++ llvm/lib/Target/X86/X86FloatingPoint.cpp Fri Jan 20 20:55:41 2006 @@ -324,11 +324,11 @@ { X86::FpADD32m , X86::FADD32m }, { X86::FpADD64m , X86::FADD64m }, { X86::FpCHS , X86::FCHS }, - { X86::FpCMOVA , X86::FCMOVA }, - { X86::FpCMOVAE , X86::FCMOVAE }, { X86::FpCMOVB , X86::FCMOVB }, { X86::FpCMOVBE , X86::FCMOVBE }, { X86::FpCMOVE , X86::FCMOVE }, + { X86::FpCMOVNB , X86::FCMOVNB }, + { X86::FpCMOVNBE , X86::FCMOVNBE }, { X86::FpCMOVNE , X86::FCMOVNE }, { X86::FpCMOVNP , X86::FCMOVNP }, { X86::FpCMOVP , X86::FCMOVP }, Index: llvm/lib/Target/X86/X86ISelPattern.cpp diff -u llvm/lib/Target/X86/X86ISelPattern.cpp:1.198 llvm/lib/Target/X86/X86ISelPattern.cpp:1.199 --- llvm/lib/Target/X86/X86ISelPattern.cpp:1.198 Sun Jan 15 03:00:21 2006 +++ llvm/lib/Target/X86/X86ISelPattern.cpp Fri Jan 20 20:55:41 2006 @@ -758,7 +758,7 @@ static const unsigned CMOVTABFP[] = { X86::FpCMOVE, X86::FpCMOVNE, /*missing*/0, /*missing*/0, /*missing*/0, /*missing*/ 0, X86::FpCMOVB, X86::FpCMOVBE, - X86::FpCMOVA, X86::FpCMOVAE, X86::FpCMOVP, X86::FpCMOVNP + X86::FpCMOVNBE,X86::FpCMOVNB, X86::FpCMOVP, X86::FpCMOVNP }; static const int SSE_CMOVTAB[] = { /*CMPEQ*/ 0, /*CMPNEQ*/ 4, /*missing*/ 0, /*missing*/ 0, Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.215 llvm/lib/Target/X86/X86InstrInfo.td:1.216 --- llvm/lib/Target/X86/X86InstrInfo.td:1.215 Thu Jan 19 19:13:30 2006 +++ llvm/lib/Target/X86/X86InstrInfo.td Fri Jan 20 20:55:41 2006 @@ -2862,10 +2862,10 @@ def FpCMOVP : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), CondMovFP, [(set RFP:$dst, (X86cmov RFP:$src1, RFP:$src2, X86_COND_P, STATUS))]>; - def FpCMOVAE : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), CondMovFP, + def FpCMOVNB : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), CondMovFP, [(set RFP:$dst, (X86cmov RFP:$src1, RFP:$src2, X86_COND_AE, STATUS))]>; - def FpCMOVA : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), CondMovFP, + def FpCMOVNBE: FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), CondMovFP, [(set RFP:$dst, (X86cmov RFP:$src1, RFP:$src2, X86_COND_A, STATUS))]>; def FpCMOVNE : FpI<(ops RFP:$dst, RFP:$src1, RFP:$src2), CondMovFP, @@ -2884,10 +2884,10 @@ "fcmove {$op, %ST(0)|%ST(0), $op}">, DA; def FCMOVP : FPI<0xD8, AddRegFrm, (ops RST:$op), "fcmovu {$op, %ST(0)|%ST(0), $op}">, DA; -def FCMOVAE : FPI<0xC0, AddRegFrm, (ops RST:$op), - "fcmovae {$op, %ST(0)|%ST(0), $op}">, DB; -def FCMOVA : FPI<0xD0, AddRegFrm, (ops RST:$op), - "fcmova {$op, %ST(0)|%ST(0), $op}">, DB; +def FCMOVNB : FPI<0xC0, AddRegFrm, (ops RST:$op), + "fcmovnb {$op, %ST(0)|%ST(0), $op}">, DB; +def FCMOVNBE : FPI<0xD0, AddRegFrm, (ops RST:$op), + "fcmovnbe {$op, %ST(0)|%ST(0), $op}">, DB; def FCMOVNE : FPI<0xC8, AddRegFrm, (ops RST:$op), "fcmovne {$op, %ST(0)|%ST(0), $op}">, DB; def FCMOVNP : FPI<0xD8, AddRegFrm, (ops RST:$op), From lattner at cs.uiuc.edu Fri Jan 20 22:25:19 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 22:25:19 -0600 Subject: [llvm-commits] CVS: llvm/test/Regression/CodeGen/PowerPC/2006-01-20-ShiftPartsCrash.ll Message-ID: <200601210425.WAA04653@zion.cs.uiuc.edu> Changes in directory llvm/test/Regression/CodeGen/PowerPC: 2006-01-20-ShiftPartsCrash.ll added (r1.1) --- Log message: new testcase that crashes llc for ppc --- Diffs of the changes: (+17 -0) 2006-01-20-ShiftPartsCrash.ll | 17 +++++++++++++++++ 1 files changed, 17 insertions(+) Index: llvm/test/Regression/CodeGen/PowerPC/2006-01-20-ShiftPartsCrash.ll diff -c /dev/null llvm/test/Regression/CodeGen/PowerPC/2006-01-20-ShiftPartsCrash.ll:1.1 *** /dev/null Fri Jan 20 22:25:17 2006 --- llvm/test/Regression/CodeGen/PowerPC/2006-01-20-ShiftPartsCrash.ll Fri Jan 20 22:25:07 2006 *************** *** 0 **** --- 1,17 ---- + ; RUN: llvm-as < %s | llc + + void %iterative_hash_host_wide_int() { + %zero = alloca int ; [#uses=2] + %b = alloca uint ; [#uses=1] + store int 0, int* %zero + %tmp = load int* %zero ; [#uses=1] + %tmp5 = cast int %tmp to uint ; [#uses=1] + %tmp6 = add uint %tmp5, 32 ; [#uses=1] + %tmp6 = cast uint %tmp6 to int ; [#uses=1] + %tmp7 = load long* null ; [#uses=1] + %tmp6 = cast int %tmp6 to ubyte ; [#uses=1] + %tmp8 = shr long %tmp7, ubyte %tmp6 ; [#uses=1] + %tmp8 = cast long %tmp8 to uint ; [#uses=1] + store uint %tmp8, uint* %b + unreachable + } From lattner at cs.uiuc.edu Fri Jan 20 22:27:11 2006 From: lattner at cs.uiuc.edu (Chris Lattner) Date: Fri, 20 Jan 2006 22:27:11 -0600 Subject: [llvm-commits] CVS: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Message-ID: <200601210427.WAA04712@zion.cs.uiuc.edu> Changes in directory llvm/lib/CodeGen/SelectionDAG: LegalizeDAG.cpp updated: 1.273 -> 1.274 --- Log message: Fix CodeGen/PowerPC/2006-01-20-ShiftPartsCrash.ll --- Diffs of the changes: (+15 -15) LegalizeDAG.cpp | 30 +++++++++++++++--------------- 1 files changed, 15 insertions(+), 15 deletions(-) Index: llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp diff -u llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.273 llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.274 --- llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp:1.273 Fri Jan 20 12:40:10 2006 +++ llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp Fri Jan 20 22:27:00 2006 @@ -3710,9 +3710,9 @@ NeedsAnotherIteration = true; switch (Node->getOpcode()) { - case ISD::CopyFromReg: - assert(0 && "CopyFromReg must be legal!"); - default: + case ISD::CopyFromReg: + assert(0 && "CopyFromReg must be legal!"); + default: std::cerr << "NODE: "; Node->dump(); std::cerr << "\n"; assert(0 && "Do not know how to expand this operator!"); abort(); @@ -4161,9 +4161,10 @@ case ISD::SHL: { // If the target wants custom lowering, do so. + SDOperand ShiftAmt = LegalizeOp(Node->getOperand(1)); if (TLI.getOperationAction(ISD::SHL, VT) == TargetLowering::Custom) { SDOperand Op = DAG.getNode(ISD::SHL, VT, Node->getOperand(0), - LegalizeOp(Node->getOperand(1))); + ShiftAmt); Op = TLI.LowerOperation(Op, DAG); if (Op.Val) { // Now that the custom expander is done, expand the result, which is @@ -4174,7 +4175,7 @@ } // If we can emit an efficient shift operation, do so now. - if (ExpandShift(ISD::SHL, Node->getOperand(0), Node->getOperand(1), Lo, Hi)) + if (ExpandShift(ISD::SHL, Node->getOperand(0), ShiftAmt, Lo, Hi)) break; // If this target supports SHL_PARTS, use it. @@ -4182,8 +4183,7 @@ TLI.getOperationAction(ISD::SHL_PARTS, NVT); if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || Action == TargetLowering::Custom) { - ExpandShiftParts(ISD::SHL_PARTS, Node->getOperand(0), Node->getOperand(1), - Lo, Hi); + ExpandShiftParts(ISD::SHL_PARTS, Node->getOperand(0), ShiftAmt, Lo, Hi); break; } @@ -4194,9 +4194,10 @@ case ISD::SRA: { // If the target wants custom lowering, do so. + SDOperand ShiftAmt = LegalizeOp(Node->getOperand(1)); if (TLI.getOperationAction(ISD::SRA, VT) == TargetLowering::Custom) { SDOperand Op = DAG.getNode(ISD::SRA, VT, Node->getOperand(0), - LegalizeOp(Node->getOperand(1))); + ShiftAmt); Op = TLI.LowerOperation(Op, DAG); if (Op.Val) { // Now that the custom expander is done, expand the result, which is @@ -4207,7 +4208,7 @@ } // If we can emit an efficient shift operation, do so now. - if (ExpandShift(ISD::SRA, Node->getOperand(0), Node->getOperand(1), Lo, Hi)) + if (ExpandShift(ISD::SRA, Node->getOperand(0), ShiftAmt, Lo, Hi)) break; // If this target supports SRA_PARTS, use it. @@ -4215,8 +4216,7 @@ TLI.getOperationAction(ISD::SRA_PARTS, NVT); if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || Action == TargetLowering::Custom) { - ExpandShiftParts(ISD::SRA_PARTS, Node->getOperand(0), Node->getOperand(1), - Lo, Hi); + ExpandShiftParts(ISD::SRA_PARTS, Node->getOperand(0), ShiftAmt, Lo, Hi); break; } @@ -4227,9 +4227,10 @@ case ISD::SRL: { // If the target wants custom lowering, do so. + SDOperand ShiftAmt = LegalizeOp(Node->getOperand(1)); if (TLI.getOperationAction(ISD::SRL, VT) == TargetLowering::Custom) { SDOperand Op = DAG.getNode(ISD::SRL, VT, Node->getOperand(0), - LegalizeOp(Node->getOperand(1))); + ShiftAmt); Op = TLI.LowerOperation(Op, DAG); if (Op.Val) { // Now that the custom expander is done, expand the result, which is @@ -4240,7 +4241,7 @@ } // If we can emit an efficient shift operation, do so now. - if (ExpandShift(ISD::SRL, Node->getOperand(0), Node->getOperand(1), Lo, Hi)) + if (ExpandShift(ISD::SRL, Node->getOperand(0), ShiftAmt, Lo, Hi)) break; // If this target supports SRL_PARTS, use it. @@ -4248,8 +4249,7 @@ TLI.getOperationAction(ISD::SRL_PARTS, NVT); if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) || Action == TargetLowering::Custom) { - ExpandShiftParts(ISD::SRL_PARTS, Node->getOperand(0), Node->getOperand(1), - Lo, Hi); + ExpandShiftParts(ISD::SRL_PARTS, Node->getOperand(0), ShiftAmt, Lo, Hi); break; } From duraid at octopus.com.au Sat Jan 21 08:27:41 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Sat, 21 Jan 2006 08:27:41 -0600 Subject: [llvm-commits] CVS: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Message-ID: <200601211427.IAA17305@zion.cs.uiuc.edu> Changes in directory llvm/lib/Target/IA64: IA64ISelDAGToDAG.cpp updated: 1.28 -> 1.29 --- Log message: insignificant, but next up is proper stack frame layout! --- Diffs of the changes: (+2 -1) IA64ISelDAGToDAG.cpp | 3 ++- 1 files changed, 2 insertions(+), 1 deletion(-) Index: llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp diff -u llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.28 llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.29 --- llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp:1.28 Fri Jan 20 14:24:31 2006 +++ llvm/lib/Target/IA64/IA64ISelDAGToDAG.cpp Sat Jan 21 08:27:19 2006 @@ -464,7 +464,8 @@ if (N->hasOneUse()) return CurDAG->SelectNodeTo(N, IA64::MOV, MVT::i64, CurDAG->getTargetFrameIndex(FI, MVT::i64)); - return CurDAG->getTargetNode(IA64::MOV, MVT::i64, + else + return CodeGenMap[Op] = CurDAG->getTargetNode(IA64::MOV, MVT::i64, CurDAG->getTargetFrameIndex(FI, MVT::i64)); } From llvm at cs.uiuc.edu Sat Jan 21 08:48:24 2006 From: llvm at cs.uiuc.edu (LLVM) Date: Sat, 21 Jan 2006 08:48:24 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Applications/oggenc/ Message-ID: <200601211448.IAA17406@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Applications/oggenc: --- Log message: Directory /var/cvs/llvm/llvm-test/MultiSource/Applications/oggenc added to the repository --- Diffs of the changes: (+0 -0) 0 files changed From duraid at octopus.com.au Sat Jan 21 08:49:20 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Sat, 21 Jan 2006 08:49:20 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Applications/Makefile Message-ID: <200601211449.IAA17423@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Applications: Makefile updated: 1.22 -> 1.23 --- Log message: adding the ogg vorbis encoder --- Diffs of the changes: (+1 -1) Makefile | 2 +- 1 files changed, 1 insertion(+), 1 deletion(-) Index: llvm-test/MultiSource/Applications/Makefile diff -u llvm-test/MultiSource/Applications/Makefile:1.22 llvm-test/MultiSource/Applications/Makefile:1.23 --- llvm-test/MultiSource/Applications/Makefile:1.22 Tue Nov 8 15:11:32 2005 +++ llvm-test/MultiSource/Applications/Makefile Sat Jan 21 08:49:08 2006 @@ -4,7 +4,7 @@ include $(LEVEL)/Makefile.config -PARALLEL_DIRS = Burg aha sgefa siod lambda-0.1.3 d spiff hbd treecc SPASS hexxagon +PARALLEL_DIRS = Burg aha sgefa siod lambda-0.1.3 d spiff hbd treecc SPASS hexxagon oggenc # Obsequi uses Linux-only features; need to fix that ifeq ($(OS),Linux) From duraid at octopus.com.au Sat Jan 21 08:50:13 2006 From: duraid at octopus.com.au (Duraid Madina) Date: Sat, 21 Jan 2006 08:50:13 -0600 Subject: [llvm-commits] CVS: llvm-test/MultiSource/Applications/oggenc/Makefile oggenc.c Message-ID: <200601211450.IAA17453@zion.cs.uiuc.edu> Changes in directory llvm-test/MultiSource/Applications/oggenc: Makefile added (r1.1) oggenc.c added (r1.1) --- Log message: adding the ogg encoder --- Diffs of the changes: (+58422 -0) Makefile | 10 oggenc.c |58412 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58422 insertions(+) Index: llvm-test/MultiSource/Applications/oggenc/Makefile diff -c /dev/null llvm-test/MultiSource/Applications/oggenc/Makefile:1.1 *** /dev/null Sat Jan 21 08:50:11 2006 --- llvm-test/MultiSource/Applications/oggenc/Makefile Sat Jan 21 08:50:01 2006 *************** *** 0 **** --- 1,10 ---- + LEVEL = ../../.. + PROG = oggenc + + CPPFLAGS = + LDFLAGS = -lm + + STDIN_FILENAME = $(SourceDir)/tune + RUN_OPTIONS="-Q -s 901820 -" + + include ../../Makefile.multisrc Index: llvm-test/MultiSource/Applications/oggenc/oggenc.c diff -c /dev/null llvm-test/MultiSource/Applications/oggenc/oggenc.c:1.1 *** /dev/null Sat Jan 21 08:50:13 2006 --- llvm-test/MultiSource/Applications/oggenc/oggenc.c Sat Jan 21 08:50:01 2006 *************** *** 0 **** --- 1,58412 ---- + /* OggEnc + * + * This program is distributed under the GNU General Public License, version 2. + * A copy of this license is included with this source. + * + * Copyright 2000-2002, Michael Smith + * + * Portions from Vorbize, (c) Kenneth Arnold + * and libvorbis examples, (c) Monty + */ + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + + struct option + { + # if (defined __STDC__ && __STDC__) || defined __cplusplus + const char *name; + # else + char *name; + # endif + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; + }; + + # define no_argument 0 + # define required_argument 1 + # define optional_argument 2 + + extern int getopt (int ___argc, char *const *___argv, const char *__shortopts); + extern int getopt_long (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + extern int getopt_long_only (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind); + + extern int _getopt_internal (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); + + + #define setbinmode(x) {} + #define DEFAULT_NAMEFMT_REMOVE "/" + #define DEFAULT_NAMEFMT_REPLACE NULL + + #define __ENCODE_H + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + + ******************************************************************** + + function: libvorbis codec headers + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _vorbis_codec_h_ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel libogg include + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + #define _OGG_H + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: #ifdef jail to whip a few platforms into the UNIX ideal. + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + #define _OS_TYPES_H + + /* make it easy on the folks that want to compile the libs with a + different malloc than stdlib */ + #define _ogg_malloc malloc + #define _ogg_calloc calloc + #define _ogg_realloc realloc + #define _ogg_free free + + #define __CONFIG_TYPES_H__ + + /* these are filled in by configure */ + typedef int16_t ogg_int16_t; + typedef u_int16_t ogg_uint16_t; + typedef int32_t ogg_int32_t; + typedef u_int32_t ogg_uint32_t; + typedef int64_t ogg_int64_t; + + typedef struct { + long endbyte; + int endbit; + + unsigned char *buffer; + unsigned char *ptr; + long storage; + } oggpack_buffer; + + /* ogg_page is used to encapsulate the data in one Ogg bitstream page *****/ + + typedef struct { + unsigned char *header; + long header_len; + unsigned char *body; + long body_len; + } ogg_page; + + /* ogg_stream_state contains the current encode/decode state of a logical + Ogg bitstream **********************************************************/ + + typedef struct { + unsigned char *body_data; /* bytes from packet bodies */ + long body_storage; /* storage elements allocated */ + long body_fill; /* elements stored; fill mark */ + long body_returned; /* elements of fill returned */ + + + int *lacing_vals; /* The values that will go to the segment table */ + ogg_int64_t *granule_vals; /* granulepos values for headers. Not compact + this way, but it is simple coupled to the + lacing fifo */ + long lacing_storage; + long lacing_fill; + long lacing_packet; + long lacing_returned; + + unsigned char header[282]; /* working space for header encode */ + int header_fill; + + int e_o_s; /* set when we have buffered the last packet in the + logical bitstream */ + int b_o_s; /* set after we've written the initial page + of a logical bitstream */ + long serialno; + long pageno; + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ + ogg_int64_t granulepos; + + } ogg_stream_state; + + /* ogg_packet is used to encapsulate the data and metadata belonging + to a single raw Ogg/Vorbis packet *************************************/ + + typedef struct { + unsigned char *packet; + long bytes; + long b_o_s; + long e_o_s; + + ogg_int64_t granulepos; + + ogg_int64_t packetno; /* sequence number for decode; the framing + knows where there's a hole in the data, + but we need coupling so that the codec + (which is in a seperate abstraction + layer) also knows about the gap */ + } ogg_packet; + + typedef struct { + unsigned char *data; + int storage; + int fill; + int returned; + + int unsynced; + int headerbytes; + int bodybytes; + } ogg_sync_state; + + /* Ogg BITSTREAM PRIMITIVES: bitstream ************************/ + + extern void oggpack_writeinit(oggpack_buffer *b); + extern void oggpack_writetrunc(oggpack_buffer *b,long bits); + extern void oggpack_writealign(oggpack_buffer *b); + extern void oggpack_writecopy(oggpack_buffer *b,void *source,long bits); + extern void oggpack_reset(oggpack_buffer *b); + extern void oggpack_writeclear(oggpack_buffer *b); + extern void oggpack_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); + extern void oggpack_write(oggpack_buffer *b,unsigned long value,int bits); + extern long oggpack_look(oggpack_buffer *b,int bits); + extern long oggpack_look1(oggpack_buffer *b); + extern void oggpack_adv(oggpack_buffer *b,int bits); + extern void oggpack_adv1(oggpack_buffer *b); + extern long oggpack_read(oggpack_buffer *b,int bits); + extern long oggpack_read1(oggpack_buffer *b); + extern long oggpack_bytes(oggpack_buffer *b); + extern long oggpack_bits(oggpack_buffer *b); + extern unsigned char *oggpack_get_buffer(oggpack_buffer *b); + + extern void oggpackB_writeinit(oggpack_buffer *b); + extern void oggpackB_writetrunc(oggpack_buffer *b,long bits); + extern void oggpackB_writealign(oggpack_buffer *b); + extern void oggpackB_writecopy(oggpack_buffer *b,void *source,long bits); + extern void oggpackB_reset(oggpack_buffer *b); + extern void oggpackB_writeclear(oggpack_buffer *b); + extern void oggpackB_readinit(oggpack_buffer *b,unsigned char *buf,int bytes); + extern void oggpackB_write(oggpack_buffer *b,unsigned long value,int bits); + extern long oggpackB_look(oggpack_buffer *b,int bits); + extern long oggpackB_look1(oggpack_buffer *b); + extern void oggpackB_adv(oggpack_buffer *b,int bits); + extern void oggpackB_adv1(oggpack_buffer *b); + extern long oggpackB_read(oggpack_buffer *b,int bits); + extern long oggpackB_read1(oggpack_buffer *b); + extern long oggpackB_bytes(oggpack_buffer *b); + extern long oggpackB_bits(oggpack_buffer *b); + extern unsigned char *oggpackB_get_buffer(oggpack_buffer *b); + + /* Ogg BITSTREAM PRIMITIVES: encoding **************************/ + + extern int ogg_stream_packetin(ogg_stream_state *os, ogg_packet *op); + extern int ogg_stream_pageout(ogg_stream_state *os, ogg_page *og); + extern int ogg_stream_flush(ogg_stream_state *os, ogg_page *og); + + /* Ogg BITSTREAM PRIMITIVES: decoding **************************/ + + extern int ogg_sync_init(ogg_sync_state *oy); + extern int ogg_sync_clear(ogg_sync_state *oy); + extern int ogg_sync_reset(ogg_sync_state *oy); + extern int ogg_sync_destroy(ogg_sync_state *oy); + + extern char *ogg_sync_buffer(ogg_sync_state *oy, long size); + extern int ogg_sync_wrote(ogg_sync_state *oy, long bytes); + extern long ogg_sync_pageseek(ogg_sync_state *oy,ogg_page *og); + extern int ogg_sync_pageout(ogg_sync_state *oy, ogg_page *og); + extern int ogg_stream_pagein(ogg_stream_state *os, ogg_page *og); + extern int ogg_stream_packetout(ogg_stream_state *os,ogg_packet *op); + extern int ogg_stream_packetpeek(ogg_stream_state *os,ogg_packet *op); + + /* Ogg BITSTREAM PRIMITIVES: general ***************************/ + + extern int ogg_stream_init(ogg_stream_state *os,int serialno); + extern int ogg_stream_clear(ogg_stream_state *os); + extern int ogg_stream_reset(ogg_stream_state *os); + extern int ogg_stream_reset_serialno(ogg_stream_state *os,int serialno); + extern int ogg_stream_destroy(ogg_stream_state *os); + extern int ogg_stream_eos(ogg_stream_state *os); + + extern void ogg_page_checksum_set(ogg_page *og); + + extern int ogg_page_version(ogg_page *og); + extern int ogg_page_continued(ogg_page *og); + extern int ogg_page_bos(ogg_page *og); + extern int ogg_page_eos(ogg_page *og); + extern ogg_int64_t ogg_page_granulepos(ogg_page *og); + extern int ogg_page_serialno(ogg_page *og); + extern long ogg_page_pageno(ogg_page *og); + extern int ogg_page_packets(ogg_page *og); + + extern void ogg_packet_clear(ogg_packet *op); + + + typedef struct vorbis_info{ + int version; + int channels; + long rate; + + /* The below bitrate declarations are *hints*. + Combinations of the three values carry the following implications: + + all three set to the same value: + implies a fixed rate bitstream + only nominal set: + implies a VBR stream that averages the nominal bitrate. No hard + upper/lower limit + upper and or lower set: + implies a VBR bitstream that obeys the bitrate limits. nominal + may also be set to give a nominal rate. + none set: + the coder does not care to speculate. + */ + + long bitrate_upper; + long bitrate_nominal; + long bitrate_lower; + long bitrate_window; + + void *codec_setup; + } vorbis_info; + + /* vorbis_dsp_state buffers the current vorbis audio + analysis/synthesis state. The DSP state belongs to a specific + logical bitstream ****************************************************/ + typedef struct vorbis_dsp_state{ + int analysisp; + vorbis_info *vi; + + float **pcm; + float **pcmret; + int pcm_storage; + int pcm_current; + int pcm_returned; + + int preextrapolate; + int eofflag; + + long lW; + long W; + long nW; + long centerW; + + ogg_int64_t granulepos; + ogg_int64_t sequence; + + ogg_int64_t glue_bits; + ogg_int64_t time_bits; + ogg_int64_t floor_bits; + ogg_int64_t res_bits; + + void *backend_state; + } vorbis_dsp_state; + + typedef struct vorbis_block{ + /* necessary stream state for linking to the framing abstraction */ + float **pcm; /* this is a pointer into local storage */ + oggpack_buffer opb; + + long lW; + long W; + long nW; + int pcmend; + int mode; + + int eofflag; + ogg_int64_t granulepos; + ogg_int64_t sequence; + vorbis_dsp_state *vd; /* For read-only access of configuration */ + + /* local storage to avoid remallocing; it's up to the mapping to + structure it */ + void *localstore; + long localtop; + long localalloc; + long totaluse; + struct alloc_chain *reap; + + /* bitmetrics for the frame */ + long glue_bits; + long time_bits; + long floor_bits; + long res_bits; + + void *internal; + + } vorbis_block; + + /* vorbis_block is a single block of data to be processed as part of + the analysis/synthesis stream; it belongs to a specific logical + bitstream, but is independant from other vorbis_blocks belonging to + that logical bitstream. *************************************************/ + + struct alloc_chain{ + void *ptr; + struct alloc_chain *next; + }; + + /* vorbis_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). vorbis_info and substructures are in backends.h. + *********************************************************************/ + + /* the comments are not part of vorbis_info so that vorbis_info can be + static storage */ + typedef struct vorbis_comment{ + /* unlimited user comment fields. libvorbis writes 'libvorbis' + whatever vendor is set to in encode */ + char **user_comments; + int *comment_lengths; + int comments; + char *vendor; + + } vorbis_comment; + + + /* libvorbis encodes in two abstraction layers; first we perform DSP + and produce a packet (see docs/analysis.txt). The packet is then + coded into a framed OggSquish bitstream by the second layer (see + docs/framing.txt). Decode is the reverse process; we sync/frame + the bitstream and extract individual packets, then decode the + packet back into PCM audio. + + The extra framing/packetizing is used in streaming formats, such as + files. Over the net (such as with UDP), the framing and + packetization aren't necessary as they're provided by the transport + and the streaming layer is not used */ + + /* Vorbis PRIMITIVES: general ***************************************/ + + extern void vorbis_info_init(vorbis_info *vi); + extern void vorbis_info_clear(vorbis_info *vi); + extern int vorbis_info_blocksize(vorbis_info *vi,int zo); + extern void vorbis_comment_init(vorbis_comment *vc); + extern void vorbis_comment_add(vorbis_comment *vc, char *comment); + extern void vorbis_comment_add_tag(vorbis_comment *vc, + char *tag, char *contents); + extern char *vorbis_comment_query(vorbis_comment *vc, char *tag, int count); + extern int vorbis_comment_query_count(vorbis_comment *vc, char *tag); + extern void vorbis_comment_clear(vorbis_comment *vc); + + extern int vorbis_block_init(vorbis_dsp_state *v, vorbis_block *vb); + extern int vorbis_block_clear(vorbis_block *vb); + extern void vorbis_dsp_clear(vorbis_dsp_state *v); + extern double vorbis_granule_time(vorbis_dsp_state *v, + ogg_int64_t granulepos); + + /* Vorbis PRIMITIVES: analysis/DSP layer ****************************/ + + extern int vorbis_analysis_init(vorbis_dsp_state *v,vorbis_info *vi); + extern int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); + extern int vorbis_analysis_headerout(vorbis_dsp_state *v, + vorbis_comment *vc, + ogg_packet *op, + ogg_packet *op_comm, + ogg_packet *op_code); + extern float **vorbis_analysis_buffer(vorbis_dsp_state *v,int vals); + extern int vorbis_analysis_wrote(vorbis_dsp_state *v,int vals); + extern int vorbis_analysis_blockout(vorbis_dsp_state *v,vorbis_block *vb); + extern int vorbis_analysis(vorbis_block *vb,ogg_packet *op); + + extern int vorbis_bitrate_addblock(vorbis_block *vb); + extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, + ogg_packet *op); + + /* Vorbis PRIMITIVES: synthesis layer *******************************/ + extern int vorbis_synthesis_headerin(vorbis_info *vi,vorbis_comment *vc, + ogg_packet *op); + + extern int vorbis_synthesis_init(vorbis_dsp_state *v,vorbis_info *vi); + extern int vorbis_synthesis_restart(vorbis_dsp_state *v); + extern int vorbis_synthesis(vorbis_block *vb,ogg_packet *op); + extern int vorbis_synthesis_trackonly(vorbis_block *vb,ogg_packet *op); + extern int vorbis_synthesis_blockin(vorbis_dsp_state *v,vorbis_block *vb); + extern int vorbis_synthesis_pcmout(vorbis_dsp_state *v,float ***pcm); + extern int vorbis_synthesis_lapout(vorbis_dsp_state *v,float ***pcm); + extern int vorbis_synthesis_read(vorbis_dsp_state *v,int samples); + extern long vorbis_packet_blocksize(vorbis_info *vi,ogg_packet *op); + + extern int vorbis_synthesis_halfrate(vorbis_info *v,int flag); + extern int vorbis_synthesis_halfrate_p(vorbis_info *v); + + /* Vorbis ERRORS and return codes ***********************************/ + + #define OV_FALSE -1 + #define OV_EOF -2 + #define OV_HOLE -3 + + #define OV_EREAD -128 + #define OV_EFAULT -129 + #define OV_EIMPL -130 + #define OV_EINVAL -131 + #define OV_ENOTVORBIS -132 + #define OV_EBADHEADER -133 + #define OV_EVERSION -134 + #define OV_ENOTAUDIO -135 + #define OV_EBADPACKET -136 + #define OV_EBADLINK -137 + #define OV_ENOSEEK -138 + + typedef void TIMER; + typedef long (*audio_read_func)(void *src, float **buffer, int samples); + typedef void (*progress_func)(char *fn, long totalsamples, + long samples, double time); + typedef void (*enc_end_func)(char *fn, double time, int rate, + long samples, long bytes); + typedef void (*enc_start_func)(char *fn, char *outfn, int bitrate, + float quality, int qset, int managed, int min_br, int max_br); + typedef void (*error_func)(char *errormessage); + + + void *timer_start(void); + double timer_time(void *); + void timer_clear(void *); + int create_directories(char *); + + void update_statistics_full(char *fn, long total, long done, double time); + void update_statistics_notime(char *fn, long total, long done, double time); + void update_statistics_null(char *fn, long total, long done, double time); + void start_encode_full(char *fn, char *outfn, int bitrate, float quality, int qset, + int managed, int min, int max); + void start_encode_null(char *fn, char *outfn, int bitrate, float quality, int qset, + int managed, int min, int max); + void final_statistics(char *fn, double time, int rate, long total_samples, + long bytes); + void final_statistics_null(char *fn, double time, int rate, long total_samples, + long bytes); + void encode_error(char *errmsg); + + typedef struct { + char *arg; + char *val; + } adv_opt; + + typedef struct + { + char **title; + int title_count; + char **artist; + int artist_count; + char **album; + int album_count; + char **comments; + int comment_count; + char **tracknum; + int track_count; + char **dates; + int date_count; + char **genre; + int genre_count; + adv_opt *advopt; + int advopt_count; + int copy_comments; + + int quiet; + + int rawmode; + int raw_samplesize; + int raw_samplerate; + int raw_channels; + int raw_endianness; + + char *namefmt; + char *namefmt_remove; + char *namefmt_replace; + char *outfile; + + /* All 3 in kbps */ + int managed; + int min_bitrate; + int nominal_bitrate; + int max_bitrate; + + /* Float from 0 to 1 (low->high) */ + float quality; + int quality_set; + + int resamplefreq; + int downmix; + float scale; + + unsigned int serial; + } oe_options; + + typedef struct + { + vorbis_comment *comments; + unsigned int serialno; + + audio_read_func read_samples; + progress_func progress_update; + enc_end_func end_encode; + enc_start_func start_encode; + error_func error; + + void *readdata; + + long total_samples_per_channel; + int channels; + long rate; + int samplesize; + int endianness; + int resamplefreq; + int copy_comments; + + /* Various bitrate/quality options */ + int managed; + int bitrate; + int min_bitrate; + int max_bitrate; + float quality; + int quality_set; + adv_opt *advopt; + int advopt_count; + + FILE *out; + char *filename; + char *infilename; + } oe_enc_opt; + + + int oe_encode(oe_enc_opt *opt); + + #define __AUDIO_H + + int setup_resample(oe_enc_opt *opt); + void clear_resample(oe_enc_opt *opt); + void setup_downmix(oe_enc_opt *opt); + void clear_downmix(oe_enc_opt *opt); + void setup_scaler(oe_enc_opt *opt, float scale); + void clear_scaler(oe_enc_opt *opt); + + typedef struct + { + int (*id_func)(unsigned char *buf, int len); /* Returns true if can load file */ + int id_data_len; /* Amount of data needed to id whether this can load the file */ + int (*open_func)(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen); + void (*close_func)(void *); + char *format; + char *description; + } input_format; + + + typedef struct { + short format; + short channels; + int samplerate; + int bytespersec; + short align; + short samplesize; + } wav_fmt; + + typedef struct { + short channels; + short samplesize; + long totalsamples; + long samplesread; + FILE *f; + short bigendian; + } wavfile; + + typedef struct { + short channels; + int totalframes; + short samplesize; + int rate; + int offset; + int blocksize; + } aiff_fmt; + + typedef wavfile aifffile; /* They're the same */ + + input_format *open_audio_file(FILE *in, oe_enc_opt *opt); + + int raw_open(FILE *in, oe_enc_opt *opt); + int wav_open(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen); + int aiff_open(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen); + int wav_id(unsigned char *buf, int len); + int aiff_id(unsigned char *buf, int len); + void wav_close(void *); + void raw_close(void *); + + long wav_read(void *, float **buffer, int samples); + long wav_ieee_read(void *, float **buffer, int samples); + long raw_read_stereo(void *, float **buffer, int samples); + + #define _(X) (X) + #define textdomain(X) + #define bindtextdomain(X, Y) + #define N_(X) (X) + + + #define VERSION_STRING "OggEnc v1.0.1 (libvorbis 1.0.1)\n" + #define COPYRIGHT "(c) 2000-2003 Michael Smith \n" + + #define CHUNK 4096 /* We do reads, etc. in multiples of this */ + + struct option long_options[] = { + {"quiet",0,0,'Q'}, + {"help",0,0,'h'}, + {"comment",1,0,'c'}, + {"artist",1,0,'a'}, + {"album",1,0,'l'}, + {"title",1,0,'t'}, + {"genre",1,0,'G'}, + {"names",1,0,'n'}, + {"name-remove",1,0,'X'}, + {"name-replace",1,0,'P'}, + {"output",1,0,'o'}, + {"version",0,0,'v'}, + {"raw",0,0,'r'}, + {"raw-bits",1,0,'B'}, + {"raw-chan",1,0,'C'}, + {"raw-rate",1,0,'R'}, + {"raw-endianness",1,0, 0}, + {"bitrate",1,0,'b'}, + {"min-bitrate",1,0,'m'}, + {"max-bitrate",1,0,'M'}, + {"quality",1,0,'q'}, + {"date",1,0,'d'}, + {"tracknum",1,0,'N'}, + {"serial",1,0,'s'}, + {"managed", 0, 0, 0}, + {"resample",1,0,0}, + {"downmix", 0,0,0}, + {"scale", 1, 0, 0}, + {"advanced-encode-option", 1, 0, 0}, + {"discard-comments", 0, 0, 0}, + {NULL,0,0,0} + }; + + static char *generate_name_string(char *format, char *remove_list, + char *replace_list, char *artist, char *title, char *album, + char *track, char *date, char *genre); + static void parse_options(int argc, char **argv, oe_options *opt); + static void build_comments(vorbis_comment *vc, oe_options *opt, int filenum, + char **artist,char **album, char **title, char **tracknum, char **date, + char **genre); + static void usage(void); + + int main(int argc, char **argv) + { + /* Default values */ + oe_options opt = {NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, + 0, NULL, 0, NULL, 0, NULL, 0, 1, 0, 0,16,44100,2, 0, NULL, + DEFAULT_NAMEFMT_REMOVE, DEFAULT_NAMEFMT_REPLACE, + NULL, 0, -1,-1,-1,.3,-1,0, 0,0.f, 0}; + + int i; + + char **infiles; + int numfiles; + int errors=0; + + parse_options(argc, argv, &opt); + + if(optind >= argc) + { + fprintf(stderr, _("%s%s\nERROR: No input files specified. Use -h for help.\n"), VERSION_STRING, COPYRIGHT); + return 1; + } + else + { + infiles = argv + optind; + numfiles = argc - optind; + } + + /* Now, do some checking for illegal argument combinations */ + + for(i = 0; i < numfiles; i++) + { + if(!strcmp(infiles[i], "-") && numfiles > 1) + { + fprintf(stderr, _("ERROR: Multiple files specified when using stdin\n")); + exit(1); + } + } + + if(numfiles > 1 && opt.outfile) + { + fprintf(stderr, _("ERROR: Multiple input files with specified output filename: suggest using -n\n")); + exit(1); + } + + if(opt.serial == 0) + { + /* We randomly pick a serial number. This is then incremented for each file */ + srand(time(NULL)); + opt.serial = rand(); + } + + for(i = 0; i < numfiles; i++) + { + /* Once through the loop for each file */ + + oe_enc_opt enc_opts; + vorbis_comment vc; + char *out_fn = NULL; + FILE *in, *out = NULL; + int foundformat = 0; + int closeout = 0, closein = 0; + char *artist=NULL, *album=NULL, *title=NULL, *track=NULL; + char *date=NULL, *genre=NULL; + input_format *format; + + /* Set various encoding defaults */ + + enc_opts.serialno = opt.serial++; + enc_opts.progress_update = update_statistics_full; + enc_opts.start_encode = start_encode_full; + enc_opts.end_encode = final_statistics; + enc_opts.error = encode_error; + enc_opts.comments = &vc; + enc_opts.copy_comments = opt.copy_comments; + + /* OK, let's build the vorbis_comments structure */ + build_comments(&vc, &opt, i, &artist, &album, &title, &track, + &date, &genre); + + if(!strcmp(infiles[i], "-")) + { + setbinmode(stdin); + in = stdin; + infiles[i] = NULL; + if(!opt.outfile) + { + setbinmode(stdout); + out = stdout; + } + } + else + { + in = fopen(infiles[i], "rb"); + + if(in == NULL) + { + fprintf(stderr, _("ERROR: Cannot open input file \"%s\": %s\n"), infiles[i], strerror(errno)); + free(out_fn); + errors++; + continue; + } + + closein = 1; + } + + /* Now, we need to select an input audio format - we do this before opening + the output file so that we don't end up with a 0-byte file if the input + file can't be read */ + + if(opt.rawmode) + { + enc_opts.rate=opt.raw_samplerate; + enc_opts.channels=opt.raw_channels; + enc_opts.samplesize=opt.raw_samplesize; + enc_opts.endianness=opt.raw_endianness; + raw_open(in, &enc_opts); + foundformat=1; + } + else + { + format = open_audio_file(in, &enc_opts); + if(format) + { + if(!opt.quiet) + fprintf(stderr, _("Opening with %s module: %s\n"), + format->format, format->description); + foundformat=1; + } + + } + + if(!foundformat) + { + fprintf(stderr, _("ERROR: Input file \"%s\" is not a supported format\n"), infiles[i]?infiles[i]:"(stdin)"); + if(closein) + fclose(in); + errors++; + continue; + } + + /* Ok. We can read the file - so now open the output file */ + + if(opt.outfile && !strcmp(opt.outfile, "-")) + { + setbinmode(stdout); + out = stdout; + } + else if(out == NULL) + { + if(opt.outfile) + { + out_fn = strdup(opt.outfile); + } + else if(opt.namefmt) + { + out_fn = generate_name_string(opt.namefmt, opt.namefmt_remove, + opt.namefmt_replace, artist, title, album, track,date, + genre); + } + /* This bit was widely derided in mid-2002, so it's been removed */ + /* + else if(opt.title) + { + out_fn = malloc(strlen(title) + 5); + strcpy(out_fn, title); + strcat(out_fn, ".ogg"); + } + */ + else if(infiles[i]) + { + /* Create a filename from existing filename, replacing extension with .ogg */ + char *start, *end; + + start = infiles[i]; + end = strrchr(infiles[i], '.'); + end = end?end:(start + strlen(infiles[i])+1); + + out_fn = malloc(end - start + 5); + strncpy(out_fn, start, end-start); + out_fn[end-start] = 0; + strcat(out_fn, ".ogg"); + } + else { + fprintf(stderr, _("WARNING: No filename, defaulting to \"default.ogg\"\n")); + out_fn = strdup("default.ogg"); + } + + /* Create any missing subdirectories, if possible */ + if(create_directories(out_fn)) { + if(closein) + fclose(in); + fprintf(stderr, _("ERROR: Could not create required subdirectories for output filename \"%s\"\n"), out_fn); + errors++; + free(out_fn); + continue; + } + + out = fopen(out_fn, "wb"); + if(out == NULL) + { + if(closein) + fclose(in); + fprintf(stderr, _("ERROR: Cannot open output file \"%s\": %s\n"), out_fn, strerror(errno)); + errors++; + free(out_fn); + continue; + } + closeout = 1; + } + + /* Now, set the rest of the options */ + enc_opts.out = out; + enc_opts.comments = &vc; + enc_opts.filename = out_fn; + enc_opts.infilename = infiles[i]; + enc_opts.managed = opt.managed; + enc_opts.bitrate = opt.nominal_bitrate; + enc_opts.min_bitrate = opt.min_bitrate; + enc_opts.max_bitrate = opt.max_bitrate; + enc_opts.quality = opt.quality; + enc_opts.quality_set = opt.quality_set; + enc_opts.advopt = opt.advopt; + enc_opts.advopt_count = opt.advopt_count; + + if(opt.resamplefreq && opt.resamplefreq != enc_opts.rate) { + int fromrate = enc_opts.rate; + enc_opts.resamplefreq = opt.resamplefreq; + if(setup_resample(&enc_opts)) { + errors++; + goto clear_all; + } + else if(!opt.quiet) + fprintf(stderr, _("Resampling input from %d Hz to %d Hz\n"), fromrate, opt.resamplefreq); + } + + if(opt.downmix) { + if(enc_opts.channels == 2) { + setup_downmix(&enc_opts); + if(!opt.quiet) + fprintf(stderr, _("Downmixing stereo to mono\n")); + } + else { + fprintf(stderr, _("ERROR: Can't downmix except from stereo to mono\n")); + errors++; + if(opt.resamplefreq && opt.resamplefreq != enc_opts.rate) + clear_resample(&enc_opts); + goto clear_all; + } + } + + if(opt.scale > 0.f) { + setup_scaler(&enc_opts, opt.scale); + if(!opt.quiet) + fprintf(stderr, _("Scaling input to %f\n"), opt.scale); + } + + + if(!enc_opts.total_samples_per_channel) + enc_opts.progress_update = update_statistics_notime; + + if(opt.quiet) + { + enc_opts.start_encode = start_encode_null; + enc_opts.progress_update = update_statistics_null; + enc_opts.end_encode = final_statistics_null; + } + + if(oe_encode(&enc_opts)) + errors++; + + if(opt.scale > 0) + clear_scaler(&enc_opts); + if(opt.downmix) + clear_downmix(&enc_opts); + if(opt.resamplefreq && opt.resamplefreq != enc_opts.rate) + clear_resample(&enc_opts); + clear_all: + + if(out_fn) free(out_fn); + if(opt.outfile) free(opt.outfile); + vorbis_comment_clear(&vc); + if(!opt.rawmode) + format->close_func(enc_opts.readdata); + + if(closein) + fclose(in); + if(closeout) + fclose(out); + }/* Finished this file, loop around to next... */ + + return errors?1:0; + + } + + static void usage(void) + { + fprintf(stdout, + _("%s%s\n" + "Usage: oggenc [options] input.wav [...]\n" + "\n" + "OPTIONS:\n" + " General:\n" + " -Q, --quiet Produce no output to stderr\n" + " -h, --help Print this help text\n" + " -r, --raw Raw mode. Input files are read directly as PCM data\n" + " -B, --raw-bits=n Set bits/sample for raw input. Default is 16\n" + " -C, --raw-chan=n Set number of channels for raw input. Default is 2\n" + " -R, --raw-rate=n Set samples/sec for raw input. Default is 44100\n" + " --raw-endianness 1 for bigendian, 0 for little (defaults to 0)\n" + " -b, --bitrate Choose a nominal bitrate to encode at. Attempt\n" + " to encode at a bitrate averaging this. Takes an\n" + " argument in kbps. This uses the bitrate management\n" + " engine, and is not recommended for most users.\n" + " See -q, --quality for a better alternative.\n" + " -m, --min-bitrate Specify a minimum bitrate (in kbps). Useful for\n" + " encoding for a fixed-size channel.\n" + " -M, --max-bitrate Specify a maximum bitrate in kbps. Useful for\n" + " streaming applications.\n" + " -q, --quality Specify quality between 0 (low) and 10 (high),\n" + " instead of specifying a particular bitrate.\n" + " This is the normal mode of operation.\n" + " Fractional qualities (e.g. 2.75) are permitted\n" + " Quality -1 is also possible, but may not be of\n" + " acceptable quality.\n" + " --resample n Resample input data to sampling rate n (Hz)\n" + " --downmix Downmix stereo to mono. Only allowed on stereo\n" + " input.\n" + " -s, --serial Specify a serial number for the stream. If encoding\n" + " multiple files, this will be incremented for each\n" + " stream after the first.\n" + " --discard-comments Prevents comments in FLAC and Ogg FLAC files from\n" + " being copied to the output Ogg Vorbis file.\n" + "\n" + " Naming:\n" + " -o, --output=fn Write file to fn (only valid in single-file mode)\n" + " -n, --names=string Produce filenames as this string, with %%a, %%t, %%l,\n" + " %%n, %%d replaced by artist, title, album, track number,\n" + " and date, respectively (see below for specifying these).\n" + " %%%% gives a literal %%.\n" + " -X, --name-remove=s Remove the specified characters from parameters to the\n" + " -n format string. Useful to ensure legal filenames.\n" + " -P, --name-replace=s Replace characters removed by --name-remove with the\n" + " characters specified. If this string is shorter than the\n" + " --name-remove list or is not specified, the extra\n" + " characters are just removed.\n" + " Default settings for the above two arguments are platform\n" + " specific.\n" + " -c, --comment=c Add the given string as an extra comment. This may be\n" + " used multiple times. The argument should be in the\n" + " format \"tag=value\".\n" + " -d, --date Date for track (usually date of performance)\n" + " -N, --tracknum Track number for this track\n" + " -t, --title Title for this track\n" + " -l, --album Name of album\n" + " -a, --artist Name of artist\n" + " -G, --genre Genre of track\n" + " If multiple input files are given, then multiple\n" + " instances of the previous five arguments will be used,\n" + " in the order they are given. If fewer titles are\n" + " specified than files, OggEnc will print a warning, and\n" + " reuse the final one for the remaining files. If fewer\n" + " track numbers are given, the remaining files will be\n" + " unnumbered. For the others, the final tag will be reused\n" + " for all others without warning (so you can specify a date\n" + " once, for example, and have it used for all the files)\n" + "\n" + "INPUT FILES:\n" + " OggEnc input files must currently be 24, 16, or 8 bit PCM WAV, AIFF, or AIFF/C\n" + " files, 32 bit IEEE floating point WAV, and optionally FLAC or Ogg FLAC. Files\n" + " may be mono or stereo (or more channels) and any sample rate.\n" + " Alternatively, the --raw option may be used to use a raw PCM data file, which\n" + " must be 16 bit stereo little-endian PCM ('headerless wav'), unless additional\n" + " parameters for raw mode are specified.\n" + " You can specify taking the file from stdin by using - as the input filename.\n" + " In this mode, output is to stdout unless an output filename is specified\n" + " with -o\n" + "\n"), VERSION_STRING, COPYRIGHT); + } + + static int strncpy_filtered(char *dst, char *src, int len, char *remove_list, + char *replace_list) + { + char *hit, *drop_margin; + int used=0; + + if(remove_list == NULL || *remove_list == 0) + { + strncpy(dst, src, len-1); + dst[len-1] = 0; + return strlen(dst); + } + + drop_margin = remove_list + (replace_list == NULL?0:strlen(replace_list)); + + while(*src && used < len-1) + { + if((hit = strchr(remove_list, *src)) != NULL) + { + if(hit < drop_margin) + { + *dst++ = replace_list[hit - remove_list]; + used++; + } + } + else + { + *dst++ = *src; + used++; + } + src++; + } + *dst = 0; + + return used; + } + + static char *generate_name_string(char *format, char *remove_list, + char *replace_list, char *artist, char *title, char *album, + char *track, char *date, char *genre) + { + char *buffer; + char next; + char *string; + int used=0; + int buflen; + + buffer = calloc(CHUNK+1,1); + buflen = CHUNK; + + while(*format && used < buflen) + { + next = *format++; + + if(next == '%') + { + switch(*format++) + { + case '%': + *(buffer+(used++)) = '%'; + break; + case 'a': + string = artist?artist:_("(none)"); + used += strncpy_filtered(buffer+used, string, buflen-used, + remove_list, replace_list); + break; + case 'd': + string = date?date:_("(none)"); + used += strncpy_filtered(buffer+used, string, buflen-used, + remove_list, replace_list); + break; + case 'g': + string = genre?genre:_("(none)"); + used += strncpy_filtered(buffer+used, string, buflen-used, + remove_list, replace_list); + break; + case 't': + string = title?title:_("(none)"); + used += strncpy_filtered(buffer+used, string, buflen-used, + remove_list, replace_list); + break; + case 'l': + string = album?album:_("(none)"); + used += strncpy_filtered(buffer+used, string, buflen-used, + remove_list, replace_list); + break; + case 'n': + string = track?track:_("(none)"); + used += strncpy_filtered(buffer+used, string, buflen-used, + remove_list, replace_list); + break; + default: + fprintf(stderr, _("WARNING: Ignoring illegal escape character '%c' in name format\n"), *(format - 1)); + break; + } + } + else + *(buffer + (used++)) = next; + } + + return buffer; + } + + static void parse_options(int argc, char **argv, oe_options *opt) + { + int ret; + int option_index = 1; + + while((ret = getopt_long(argc, argv, "A:a:b:B:c:C:d:G:hl:m:M:n:N:o:P:q:QrR:s:t:vX:", + long_options, &option_index)) != -1) + { + switch(ret) + { + case 0: + if(!strcmp(long_options[option_index].name, "managed")) { + if(!opt->managed){ + if(!opt->quiet) + fprintf(stderr, + _("Enabling bitrate management engine\n")); + opt->managed = 1; + } + } + else if(!strcmp(long_options[option_index].name, + "raw-endianness")) { + if (opt->rawmode != 1) + { + opt->rawmode = 1; + fprintf(stderr, _("WARNING: Raw endianness specified for non-raw data. Assuming input is raw.\n")); + } + if(sscanf(optarg, "%d", &opt->raw_endianness) != 1) { + fprintf(stderr, _("WARNING: Couldn't read endianness argument \"%s\"\n"), optarg); + opt->raw_endianness = 0; + } + } + else if(!strcmp(long_options[option_index].name, + "resample")) { + if(sscanf(optarg, "%d", &opt->resamplefreq) != 1) { + fprintf(stderr, _("WARNING: Couldn't read resampling frequency \"%s\"\n"), optarg); + opt->resamplefreq = 0; + } + if(opt->resamplefreq < 100) /* User probably specified it + in kHz accidently */ + fprintf(stderr, + _("Warning: Resample rate specified as %d Hz. Did you mean %d Hz?\n"), + opt->resamplefreq, opt->resamplefreq*1000); + } + else if(!strcmp(long_options[option_index].name, "downmix")) { + opt->downmix = 1; + } + else if(!strcmp(long_options[option_index].name, "scale")) { + opt->scale = atof(optarg); + if(sscanf(optarg, "%f", &opt->scale) != 1) { + opt->scale = 0; + fprintf(stderr, _("Warning: Couldn't parse scaling factor \"%s\"\n"), + optarg); + } + } + else if(!strcmp(long_options[option_index].name, "advanced-encode-option")) { + char *arg = strdup(optarg); + char *val; + + val = strchr(arg, '='); + if(val == NULL) { + fprintf(stderr, _("No value for advanced encoder option found\n")); + continue; + } + else + *val++=0; + + opt->advopt = realloc(opt->advopt, (++opt->advopt_count)*sizeof(adv_opt)); + opt->advopt[opt->advopt_count - 1].arg = arg; + opt->advopt[opt->advopt_count - 1].val = val; + } + else if(!strcmp(long_options[option_index].name, "discard-comments")) { + opt->copy_comments = 0; + } + + else { + fprintf(stderr, _("Internal error parsing command line options\n")); + exit(1); + } + + break; + case 'a': + opt->artist = realloc(opt->artist, (++opt->artist_count)*sizeof(char *)); + opt->artist[opt->artist_count - 1] = strdup(optarg); + break; + case 'c': + if(strchr(optarg, '=') == NULL) { + fprintf(stderr, _("Warning: Illegal comment used (\"%s\"), ignoring.\n"), optarg); + break; + } + opt->comments = realloc(opt->comments, (++opt->comment_count)*sizeof(char *)); + opt->comments[opt->comment_count - 1] = strdup(optarg); + break; + case 'd': + opt->dates = realloc(opt->dates, (++opt->date_count)*sizeof(char *)); + opt->dates[opt->date_count - 1] = strdup(optarg); + break; + case 'G': + opt->genre = realloc(opt->genre, (++opt->genre_count)*sizeof(char *)); + opt->genre[opt->genre_count - 1] = strdup(optarg); + break; + case 'h': + usage(); + exit(0); + break; + case 'l': + opt->album = realloc(opt->album, (++opt->album_count)*sizeof(char *)); + opt->album[opt->album_count - 1] = strdup(optarg); + break; + case 's': + /* Would just use atoi(), but that doesn't deal with unsigned + * ints. Damn */ + if(sscanf(optarg, "%u", &opt->serial) != 1) + opt->serial = 0; /* Failed, so just set to zero */ + break; + case 't': + opt->title = realloc(opt->title, (++opt->title_count)*sizeof(char *)); + opt->title[opt->title_count - 1] = strdup(optarg); + break; + case 'b': + if(sscanf(optarg, "%d", &opt->nominal_bitrate) + != 1) { + fprintf(stderr, _("Warning: nominal bitrate \"%s\" not recognised\n"), optarg); + opt->nominal_bitrate = -1; + } + + break; + case 'm': + if(sscanf(optarg, "%d", &opt->min_bitrate) + != 1) { + fprintf(stderr, _("Warning: minimum bitrate \"%s\" not recognised\n"), optarg); + opt->min_bitrate = -1; + } + if(!opt->managed){ + if(!opt->quiet) + fprintf(stderr, + _("Enabling bitrate management engine\n")); + opt->managed = 1; + } + break; + case 'M': + if(sscanf(optarg, "%d", &opt->max_bitrate) + != 1) { + fprintf(stderr, _("Warning: maximum bitrate \"%s\" not recognised\n"), optarg); + opt->max_bitrate = -1; + } + if(!opt->managed){ + if(!opt->quiet) + fprintf(stderr, + _("Enabling bitrate management engine\n")); + opt->managed = 1; + } + break; + case 'q': + if(sscanf(optarg, "%f", &opt->quality) != 1) { + fprintf(stderr, _("Quality option \"%s\" not recognised, ignoring\n"), optarg); + break; + } + opt->quality_set=1; + opt->quality *= 0.1; + if(opt->quality > 1.0f) + { + opt->quality = 1.0f; + fprintf(stderr, _("WARNING: quality setting too high, setting to maximum quality.\n")); + } + break; + case 'n': + if(opt->namefmt) + { + fprintf(stderr, _("WARNING: Multiple name formats specified, using final\n")); + free(opt->namefmt); + } + opt->namefmt = strdup(optarg); + break; + case 'X': + if(opt->namefmt_remove && opt->namefmt_remove != + DEFAULT_NAMEFMT_REMOVE) + { + fprintf(stderr, _("WARNING: Multiple name format filters specified, using final\n")); + free(opt->namefmt_remove); + } + opt->namefmt_remove = strdup(optarg); + break; + case 'P': + if(opt->namefmt_replace && opt->namefmt_replace != + DEFAULT_NAMEFMT_REPLACE) + { + fprintf(stderr, _("WARNING: Multiple name format filter replacements specified, using final\n")); + free(opt->namefmt_replace); + } + opt->namefmt_replace = strdup(optarg); + break; + case 'o': + if(opt->outfile) + { + fprintf(stderr, _("WARNING: Multiple output files specified, suggest using -n\n")); + free(opt->outfile); + } + opt->outfile = strdup(optarg); + break; + case 'Q': + opt->quiet = 1; + break; + case 'r': + opt->rawmode = 1; + break; + case 'v': + fprintf(stdout, VERSION_STRING); + exit(0); + break; + case 'B': + if (opt->rawmode != 1) + { + opt->rawmode = 1; + fprintf(stderr, _("WARNING: Raw bits/sample specified for non-raw data. Assuming input is raw.\n")); + } + if(sscanf(optarg, "%u", &opt->raw_samplesize) != 1) + { + opt->raw_samplesize = 16; /* Failed, so just set to 16 */ + fprintf(stderr, _("WARNING: Invalid bits/sample specified, assuming 16.\n")); + } + if((opt->raw_samplesize != 8) && (opt->raw_samplesize != 16)) + { + fprintf(stderr, _("WARNING: Invalid bits/sample specified, assuming 16.\n")); + } + break; + case 'C': + if (opt->rawmode != 1) + { + opt->rawmode = 1; + fprintf(stderr, _("WARNING: Raw channel count specified for non-raw data. Assuming input is raw.\n")); + } + if(sscanf(optarg, "%u", &opt->raw_channels) != 1) + { + opt->raw_channels = 2; /* Failed, so just set to 2 */ + fprintf(stderr, _("WARNING: Invalid channel count specified, assuming 2.\n")); + } + break; + case 'N': + opt->tracknum = realloc(opt->tracknum, (++opt->track_count)*sizeof(char *)); + opt->tracknum[opt->track_count - 1] = strdup(optarg); + break; + case 'R': + if (opt->rawmode != 1) + { + opt->rawmode = 1; + fprintf(stderr, _("WARNING: Raw sample rate specified for non-raw data. Assuming input is raw.\n")); + } + if(sscanf(optarg, "%u", &opt->raw_samplerate) != 1) + { + opt->raw_samplerate = 44100; /* Failed, so just set to 44100 */ + fprintf(stderr, _("WARNING: Invalid sample rate specified, assuming 44100.\n")); + } + break; + case '?': + fprintf(stderr, _("WARNING: Unknown option specified, ignoring->\n")); + break; + default: + usage(); + exit(0); + } + } + + } + + static void add_tag(vorbis_comment *vc, oe_options *opt,char *name, char *value) + { + if(name == NULL) + vorbis_comment_add(vc, value); + else + vorbis_comment_add_tag(vc, name, value); + } + + static void build_comments(vorbis_comment *vc, oe_options *opt, int filenum, + char **artist, char **album, char **title, char **tracknum, + char **date, char **genre) + { + int i; + + vorbis_comment_init(vc); + + for(i = 0; i < opt->comment_count; i++) + add_tag(vc, opt, NULL, opt->comments[i]); + + if(opt->title_count) + { + if(filenum >= opt->title_count) + { + if(!opt->quiet) + fprintf(stderr, _("WARNING: Insufficient titles specified, defaulting to final title.\n")); + i = opt->title_count-1; + } + else + i = filenum; + + *title = opt->title[i]; + add_tag(vc, opt, "title", opt->title[i]); + } + + if(opt->artist_count) + { + if(filenum >= opt->artist_count) + i = opt->artist_count-1; + else + i = filenum; + + *artist = opt->artist[i]; + add_tag(vc, opt, "artist", opt->artist[i]); + } + + if(opt->genre_count) + { + if(filenum >= opt->genre_count) + i = opt->genre_count-1; + else + i = filenum; + + *genre = opt->genre[i]; + add_tag(vc, opt, "genre", opt->genre[i]); + } + + if(opt->date_count) + { + if(filenum >= opt->date_count) + i = opt->date_count-1; + else + i = filenum; + + *date = opt->dates[i]; + add_tag(vc, opt, "date", opt->dates[i]); + } + + if(opt->album_count) + { + if(filenum >= opt->album_count) + { + i = opt->album_count-1; + } + else + i = filenum; + + *album = opt->album[i]; + add_tag(vc, opt, "album", opt->album[i]); + } + + if(filenum < opt->track_count) + { + i = filenum; + *tracknum = opt->tracknum[i]; + add_tag(vc, opt, "tracknumber", opt->tracknum[i]); + } + } + + /* OggEnc + ** + ** This program is distributed under the GNU General Public License, version 2. + ** A copy of this license is included with this source. + ** + ** Copyright 2000-2002, Michael Smith + ** + ** AIFF/AIFC support from OggSquish, (c) 1994-1996 Monty + **/ + + + /* This program is licensed under the GNU Library General Public License, + * version 2, a copy of which is included with this program (LICENCE.LGPL). + * + * (c) 2002 Simon Hosie + * + * + * A resampler + * + * reference: + * 'Digital Filters', third edition, by R. W. Hamming ISBN 0-486-65088-X + * + * history: + * 2002-05-31 ready for the world (or some small section thereof) + * + * + * TOOD: + * zero-crossing clipping in coefficient table + */ + + #define _RESAMPLE_H_INCLUDED + + typedef float SAMPLE; + + typedef struct + { + unsigned int channels, infreq, outfreq, taps; + float *table; + SAMPLE *pool; + + /* dynamic bits */ + int poolfill; + int offset; + } res_state; + + typedef enum + { + RES_END, + RES_GAIN, /* (double)1.0 */ + RES_CUTOFF, /* (double)0.80 */ + RES_TAPS, /* (int)45 */ + RES_BETA /* (double)16.0 */ + } res_parameter; + + int res_init(res_state *state, int channels, int outfreq, int infreq, res_parameter op1, ...); + /* + * Configure *state to manage a data stream with the specified parameters. The + * string 'params' is currently unspecified, but will configure the parameters + * of the filter. + * + * This function allocates memory, and requires that res_clear() be called when + * the buffer is no longer needed. + * + * + * All counts/lengths used in the following functions consider only the data in + * a single channel, and in numbers of samples rather than bytes, even though + * functionality will be mirrored across as many channels as specified here. + */ + + + int res_push_max_input(res_state const *state, size_t maxoutput); + /* + * Returns the maximum number of input elements that may be provided without + * risk of flooding an output buffer of size maxoutput. maxoutput is + * specified in counts of elements, NOT in bytes. + */ + + + int res_push_check(res_state const *state, size_t srclen); + /* + * Returns the number of elements that will be returned if the given srclen + * is used in the next call to res_push(). + */ + + + int res_push(res_state *state, SAMPLE **dstlist, SAMPLE const **srclist, size_t srclen); + int res_push_interleaved(res_state *state, SAMPLE *dest, SAMPLE const *source, size_t srclen); + /* + * Pushes srclen samples into the front end of the filter, and returns the + * number of resulting samples. + * + * res_push(): srclist and dstlist point to lists of pointers, each of which + * indicates the beginning of a list of samples. + * + * res_push_interleaved(): source and dest point to the beginning of a list of + * interleaved samples. + */ + + + int res_drain(res_state *state, SAMPLE **dstlist); + int res_drain_interleaved(res_state *state, SAMPLE *dest); + /* + * Recover the remaining elements by flushing the internal pool with 0 values, + * and storing the resulting samples. + * + * After either of these functions are called, *state should only re-used in a + * final call to res_clear(). + */ + + + void res_clear(res_state *state); + /* + * Free allocated buffers, etc. + */ + + #define WAV_HEADER_SIZE 44 + + /* Macros to read header data */ + #define READ_U32_LE(buf) \ + (((buf)[3]<<24)|((buf)[2]<<16)|((buf)[1]<<8)|((buf)[0]&0xff)) + + #define READ_U16_LE(buf) \ + (((buf)[1]<<8)|((buf)[0]&0xff)) + + #define READ_U32_BE(buf) \ + (((buf)[0]<<24)|((buf)[1]<<16)|((buf)[2]<<8)|((buf)[3]&0xff)) + + #define READ_U16_BE(buf) \ + (((buf)[0]<<8)|((buf)[1]&0xff)) + + /* Define the supported formats here */ + input_format formats[] = { + {wav_id, 12, wav_open, wav_close, "wav", N_("WAV file reader")}, + {aiff_id, 12, aiff_open, wav_close, "aiff", N_("AIFF/AIFC file reader")}, + #ifdef HAVE_LIBFLAC + {flac_id, 4, flac_open, flac_close, "flac", N_("FLAC file reader")}, + {oggflac_id, 32, flac_open, flac_close, "ogg", N_("Ogg FLAC file reader")}, + #endif + {NULL, 0, NULL, NULL, NULL, NULL} + }; + + input_format *open_audio_file(FILE *in, oe_enc_opt *opt) + { + int j=0; + unsigned char *buf=NULL; + int buf_size=0, buf_filled=0; + int size,ret; + + while(formats[j].id_func) + { + size = formats[j].id_data_len; + if(size >= buf_size) + { + buf = realloc(buf, size); + buf_size = size; + } + + if(size > buf_filled) + { + ret = fread(buf+buf_filled, 1, buf_size-buf_filled, in); + buf_filled += ret; + + if(buf_filled < size) + { /* File truncated */ + j++; + continue; + } + } + + if(formats[j].id_func(buf, buf_filled)) + { + /* ok, we now have something that can handle the file */ + if(formats[j].open_func(in, opt, buf, buf_filled)) { + free(buf); + return &formats[j]; + } + } + j++; + } + + free(buf); + + return NULL; + } + + static int seek_forward(FILE *in, int length) + { + if(fseek(in, length, SEEK_CUR)) + { + /* Failed. Do it the hard way. */ + unsigned char buf[1024]; + int seek_needed = length, seeked; + while(seek_needed > 0) + { + seeked = fread(buf, 1, seek_needed>1024?1024:seek_needed, in); + if(!seeked) + return 0; /* Couldn't read more, can't read file */ + else + seek_needed -= seeked; + } + } + return 1; + } + + + static int find_wav_chunk(FILE *in, char *type, unsigned int *len) + { + unsigned char buf[8]; + + while(1) + { + if(fread(buf,1,8,in) < 8) /* Suck down a chunk specifier */ + { + fprintf(stderr, _("Warning: Unexpected EOF in reading WAV header\n")); + return 0; /* EOF before reaching the appropriate chunk */ + } + + if(memcmp(buf, type, 4)) + { + *len = READ_U32_LE(buf+4); + if(!seek_forward(in, *len)) + return 0; + + buf[4] = 0; + fprintf(stderr, _("Skipping chunk of type \"%s\", length %d\n"), buf, *len); + } + else + { + *len = READ_U32_LE(buf+4); + return 1; + } + } + } + + static int find_aiff_chunk(FILE *in, char *type, unsigned int *len) + { + unsigned char buf[8]; + + while(1) + { + if(fread(buf,1,8,in) <8) + { + fprintf(stderr, _("Warning: Unexpected EOF in AIFF chunk\n")); + return 0; + } + + *len = READ_U32_BE(buf+4); + + if(memcmp(buf,type,4)) + { + if((*len) & 0x1) + (*len)++; + + if(!seek_forward(in, *len)) + return 0; + } + else + return 1; + } + } + + + + double read_IEEE80(unsigned char *buf) + { + int s=buf[0]&0xff; + int e=((buf[0]&0x7f)<<8)|(buf[1]&0xff); + double f=((unsigned long)(buf[2]&0xff)<<24)| + ((buf[3]&0xff)<<16)| + ((buf[4]&0xff)<<8) | + (buf[5]&0xff); + + if(e==32767) + { + if(buf[2]&0x80) + return HUGE_VAL; /* Really NaN, but this won't happen in reality */ + else + { + if(s) + return -HUGE_VAL; + else + return HUGE_VAL; + } + } + + f=ldexp(f,32); + f+= ((buf[6]&0xff)<<24)| + ((buf[7]&0xff)<<16)| + ((buf[8]&0xff)<<8) | + (buf[9]&0xff); + + return ldexp(f, e-16446); + } + + /* AIFF/AIFC support adapted from the old OggSQUISH application */ + int aiff_id(unsigned char *buf, int len) + { + if(len<12) return 0; /* Truncated file, probably */ + + if(memcmp(buf, "FORM", 4)) + return 0; + + if(memcmp(buf+8, "AIF",3)) + return 0; + + if(buf[11]!='C' && buf[11]!='F') + return 0; + + return 1; + } + + int aiff_open(FILE *in, oe_enc_opt *opt, unsigned char *buf, int buflen) + { + int aifc; /* AIFC or AIFF? */ + unsigned int len; + unsigned char *buffer; + unsigned char buf2[8]; + aiff_fmt format; + aifffile *aiff = malloc(sizeof(aifffile)); + + if(buf[11]=='C') + aifc=1; + else + aifc=0; + + if(!find_aiff_chunk(in, "COMM", &len)) + { + fprintf(stderr, _("Warning: No common chunk found in AIFF file\n")); + return 0; /* EOF before COMM chunk */ + } + + if(len < 18) + { + fprintf(stderr, _("Warning: Truncated common chunk in AIFF header\n")); + return 0; /* Weird common chunk */ + } + + buffer = alloca(len); + + if(fread(buffer,1,len,in) < len) + { + fprintf(stderr, _("Warning: Unexpected EOF in reading AIFF header\n")); + return 0; + } + + format.channels = READ_U16_BE(buffer); + format.totalframes = READ_U32_BE(buffer+2); + format.samplesize = READ_U16_BE(buffer+6); + format.rate = (int)read_IEEE80(buffer+8); + + aiff->bigendian = 1; + + if(aifc) + { + if(len < 22) + { + fprintf(stderr, _("Warning: AIFF-C header truncated.\n")); + return 0; + } + + if(!memcmp(buffer+18, "NONE", 4)) + { + aiff->bigendian = 1; + } + else if(!memcmp(buffer+18, "sowt", 4)) + { + aiff->bigendian = 0; + } + else + { + fprintf(stderr, _("Warning: Can't handle compressed AIFF-C (%c%c%c%c)\n"), *(buffer+18), *(buffer+19), *(buffer+20), *(buffer+21)); + return 0; /* Compressed. Can't handle */ + } + } + + if(!find_aiff_chunk(in, "SSND", &len)) + { + fprintf(stderr, _("Warning: No SSND chunk found in AIFF file\n")); + return 0; /* No SSND chunk -> no actual audio */ + } + + if(len < 8) + { + fprintf(stderr, _("Warning: Corrupted SSND chunk in AIFF header\n")); + return 0; + } + + if(fread(buf2,1,8, in) < 8) + { + fprintf(stderr, _("Warning: Unexpected EOF reading AIFF header\n")); + return 0; + } + + format.offset = READ_U32_BE(buf2); + format.blocksize = READ_U32_BE(buf2+4); + + if( format.blocksize == 0 && + (format.samplesize == 16 || format.samplesize == 8)) + { + /* From here on, this is very similar to the wav code. Oh well. */ + + opt->rate = format.rate; + opt->channels = format.channels; + opt->read_samples = wav_read; /* Similar enough, so we use the same */ + opt->total_samples_per_channel = format.totalframes; + + aiff->f = in; + aiff->samplesread = 0; + aiff->channels = format.channels; + aiff->samplesize = format.samplesize; + aiff->totalsamples = format.totalframes; + + opt->readdata = (void *)aiff; + + seek_forward(in, format.offset); /* Swallow some data */ + return 1; + } + else + { + fprintf(stderr, + _("Warning: OggEnc does not support this type of AIFF/AIFC file\n" + " Must be 8, 16, or 24 bit PCM.\n")); + return 0; + } + } + + + int wav_id(unsigned char *buf, int len) + { + unsigned int flen; + + if(len<12) return 0; /* Something screwed up */ + + if(memcmp(buf, "RIFF", 4)) + return 0; /* Not wave */ + + flen = READ_U32_LE(buf+4); /* We don't use this */ + + if(memcmp(buf+8, "WAVE",4)) + return 0; /* RIFF, but not wave */ + + return 1; + } + + int wav_open(FILE *in, oe_enc_opt *opt, unsigned char *oldbuf, int buflen) + { + unsigned char buf[16]; + unsigned int len; + int samplesize; + wav_fmt format; + wavfile *wav = malloc(sizeof(wavfile)); + + /* Ok. At this point, we know we have a WAV file. Now we have to detect + * whether we support the subtype, and we have to find the actual data + * We don't (for the wav reader) need to use the buffer we used to id this + * as a wav file (oldbuf) + */ + + if(!find_wav_chunk(in, "fmt ", &len)) + return 0; /* EOF */ + + if(len < 16) + { + fprintf(stderr, _("Warning: Unrecognised format chunk in WAV header\n")); + return 0; /* Weird format chunk */ + } + + /* A common error is to have a format chunk that is not 16 or 18 bytes + * in size. This is incorrect, but not fatal, so we only warn about + * it instead of refusing to work with the file. Please, if you + * have a program that's creating format chunks of sizes other than + * 16 or 18 bytes in size, report a bug to the author. + */ + if(len!=16 && len!=18) + fprintf(stderr, + _("Warning: INVALID format chunk in wav header.\n" + " Trying to read anyway (may not work)...\n")); + + if(fread(buf,1,16,in) < 16) + { + fprintf(stderr, _("Warning: Unexpected EOF in reading WAV header\n")); + return 0; + } + + /* Deal with stupid broken apps. Don't use these programs. + */ + if(len - 16 > 0 && !seek_forward(in, len-16)) + return 0; + + format.format = READ_U16_LE(buf); + format.channels = READ_U16_LE(buf+2); + format.samplerate = READ_U32_LE(buf+4); + format.bytespersec = READ_U32_LE(buf+8); + format.align = READ_U16_LE(buf+12); + format.samplesize = READ_U16_LE(buf+14); + + if(!find_wav_chunk(in, "data", &len)) + return 0; /* EOF */ + + if(format.format == 1) + { + samplesize = format.samplesize/8; + opt->read_samples = wav_read; + } + else if(format.format == 3) + { + samplesize = 4; + opt->read_samples = wav_ieee_read; + } + else + { + fprintf(stderr, + _("ERROR: Wav file is unsupported type (must be standard PCM\n" + " or type 3 floating point PCM\n")); + return 0; + } + + + + if( format.align == format.channels*samplesize && + format.samplesize == samplesize*8 && + (format.samplesize == 24 || format.samplesize == 16 || + format.samplesize == 8 || + (format.samplesize == 32 && format.format == 3))) + { + /* OK, good - we have the one supported format, + now we want to find the size of the file */ + opt->rate = format.samplerate; + opt->channels = format.channels; + + wav->f = in; + wav->samplesread = 0; + wav->bigendian = 0; + wav->channels = format.channels; /* This is in several places. The price + of trying to abstract stuff. */ + wav->samplesize = format.samplesize; + + if(len) + { + opt->total_samples_per_channel = len/(format.channels*samplesize); + } + else + { + long pos; + pos = ftell(in); + if(fseek(in, 0, SEEK_END) == -1) + { + opt->total_samples_per_channel = 0; /* Give up */ + } + else + { + opt->total_samples_per_channel = (ftell(in) - pos)/ + (format.channels*samplesize); + fseek(in,pos, SEEK_SET); + } + } + wav->totalsamples = opt->total_samples_per_channel; + + opt->readdata = (void *)wav; + return 1; + } + else + { + fprintf(stderr, + _("ERROR: Wav file is unsupported subformat (must be 8,16, or 24 bit PCM\n" + "or floating point PCM\n")); + return 0; + } + } + + long wav_read(void *in, float **buffer, int samples) + { + wavfile *f = (wavfile *)in; + int sampbyte = f->samplesize / 8; + signed char *buf = alloca(samples*sampbyte*f->channels); + long bytes_read = fread(buf, 1, samples*sampbyte*f->channels, f->f); + int i,j; + long realsamples; + + if(f->totalsamples && f->samplesread + + bytes_read/(sampbyte*f->channels) > f->totalsamples) { + bytes_read = sampbyte*f->channels*(f->totalsamples - f->samplesread); + } + + realsamples = bytes_read/(sampbyte*f->channels); + f->samplesread += realsamples; + + if(f->samplesize==8) + { + unsigned char *bufu = (unsigned char *)buf; + for(i = 0; i < realsamples; i++) + { + for(j=0; j < f->channels; j++) + { + buffer[j][i]=((int)(bufu[i*f->channels + j])-128)/128.0f; + } + } + } + else if(f->samplesize==16) + { + if(!f->bigendian) + { + for(i = 0; i < realsamples; i++) + { + for(j=0; j < f->channels; j++) + { + buffer[j][i] = ((buf[i*2*f->channels + 2*j + 1]<<8) | + (buf[i*2*f->channels + 2*j] & 0xff))/32768.0f; + } + } + } + else + { + for(i = 0; i < realsamples; i++) + { + for(j=0; j < f->channels; j++) + { + buffer[j][i]=((buf[i*2*f->channels + 2*j]<<8) | + (buf[i*2*f->channels + 2*j + 1] & 0xff))/32768.0f; + } + } + } + } + else if(f->samplesize==24) + { + if(!f->bigendian) { + for(i = 0; i < realsamples; i++) + { + for(j=0; j < f->channels; j++) + { + buffer[j][i] = ((buf[i*3*f->channels + 3*j + 2] << 16) | + (((unsigned char *)buf)[i*3*f->channels + 3*j + 1] << 8) | + (((unsigned char *)buf)[i*3*f->channels + 3*j] & 0xff)) + / 8388608.0f; + + } + } + } + else { + fprintf(stderr, _("Big endian 24 bit PCM data is not currently " + "supported, aborting.\n")); + return 0; + } + } + else { + fprintf(stderr, _("Internal error: attempt to read unsupported " + "bitdepth %d\n"), f->samplesize); + return 0; + } + + return realsamples; + } + + long wav_ieee_read(void *in, float **buffer, int samples) + { + wavfile *f = (wavfile *)in; + float *buf = alloca(samples*4*f->channels); /* de-interleave buffer */ + long bytes_read = fread(buf,1,samples*4*f->channels, f->f); + int i,j; + long realsamples; + + + if(f->totalsamples && f->samplesread + + bytes_read/(4*f->channels) > f->totalsamples) + bytes_read = 4*f->channels*(f->totalsamples - f->samplesread); + realsamples = bytes_read/(4*f->channels); + f->samplesread += realsamples; + + for(i=0; i < realsamples; i++) + for(j=0; j < f->channels; j++) + buffer[j][i] = buf[i*f->channels + j]; + + return realsamples; + } + + + void wav_close(void *info) + { + wavfile *f = (wavfile *)info; + + free(f); + } + + int raw_open(FILE *in, oe_enc_opt *opt) + { + wav_fmt format; /* fake wave header ;) */ + wavfile *wav = malloc(sizeof(wavfile)); + + /* construct fake wav header ;) */ + format.format = 2; + format.channels = opt->channels; + format.samplerate = opt->rate; + format.samplesize = opt->samplesize; + format.bytespersec = opt->channels * opt->rate * opt->samplesize / 8; + format.align = format.bytespersec; + wav->f = in; + wav->samplesread = 0; + wav->bigendian = opt->endianness; + wav->channels = format.channels; + wav->samplesize = opt->samplesize; + wav->totalsamples = 0; + + opt->read_samples = wav_read; + opt->readdata = (void *)wav; + opt->total_samples_per_channel = 0; /* raw mode, don't bother */ + return 1; + } + + typedef struct { + res_state resampler; + audio_read_func real_reader; + void *real_readdata; + float **bufs; + int channels; + int bufsize; + int done; + } resampler; + + static long read_resampled(void *d, float **buffer, int samples) + { + resampler *rs = d; + long in_samples; + int out_samples; + + in_samples = res_push_max_input(&rs->resampler, samples); + if(in_samples > rs->bufsize) + in_samples = rs->bufsize; + + in_samples = rs->real_reader(rs->real_readdata, rs->bufs, in_samples); + + if(in_samples <= 0) { + if(!rs->done) { + rs->done = 1; + out_samples = res_drain(&rs->resampler, buffer); + return out_samples; + } + return 0; + } + + out_samples = res_push(&rs->resampler, buffer, (float const **)rs->bufs, in_samples); + + if(out_samples <= 0) { + fprintf(stderr, _("BUG: Got zero samples from resampler: your file will be truncated. Please report this.\n")); + } + + return out_samples; + } + + int setup_resample(oe_enc_opt *opt) { + resampler *rs = calloc(1, sizeof(resampler)); + int c; + + rs->bufsize = 4096; /* Shrug */ + rs->real_reader = opt->read_samples; + rs->real_readdata = opt->readdata; + rs->bufs = malloc(sizeof(float *) * opt->channels); + rs->channels = opt->channels; + rs->done = 0; + if(res_init(&rs->resampler, rs->channels, opt->resamplefreq, opt->rate, RES_END)) + { + fprintf(stderr, _("Couldn't initialise resampler\n")); + return -1; + } + + for(c=0; c < opt->channels; c++) + rs->bufs[c] = malloc(sizeof(float) * rs->bufsize); + + opt->read_samples = read_resampled; + opt->readdata = rs; + if(opt->total_samples_per_channel) + opt->total_samples_per_channel = (int)((float)opt->total_samples_per_channel * + ((float)opt->resamplefreq/(float)opt->rate)); + opt->rate = opt->resamplefreq; + + return 0; + } + + void clear_resample(oe_enc_opt *opt) { + resampler *rs = opt->readdata; + int i; + + opt->read_samples = rs->real_reader; + opt->readdata = rs->real_readdata; + res_clear(&rs->resampler); + + for(i = 0; i < rs->channels; i++) + free(rs->bufs[i]); + + free(rs->bufs); + + free(rs); + } + + typedef struct { + audio_read_func real_reader; + void *real_readdata; + int channels; + float scale_factor; + } scaler; + + static long read_scaler(void *data, float **buffer, int samples) { + scaler *d = data; + long in_samples = d->real_reader(d->real_readdata, buffer, samples); + int i,j; + + for(i=0; i < d->channels; i++) { + for(j=0; j < in_samples; j++) { + buffer[i][j] *= d->scale_factor; + } + } + + return in_samples; + } + + + void setup_scaler(oe_enc_opt *opt, float scale) { + scaler *d = calloc(1, sizeof(scaler)); + + d->real_reader = opt->read_samples; + d->real_readdata = opt->readdata; + + opt->read_samples = read_scaler; + opt->readdata = d; + d->channels = opt->channels; + d->scale_factor = scale; + } + + void clear_scaler(oe_enc_opt *opt) { + scaler *d = opt->readdata; + + opt->read_samples = d->real_reader; + opt->readdata = d->real_readdata; + + free(d); + } + + typedef struct { + audio_read_func real_reader; + void *real_readdata; + float **bufs; + } downmix; + + static long read_downmix(void *data, float **buffer, int samples) + { + downmix *d = data; + long in_samples = d->real_reader(d->real_readdata, d->bufs, samples); + int i; + + for(i=0; i < in_samples; i++) { + buffer[0][i] = (d->bufs[0][i] + d->bufs[1][i])*0.5f; + } + + return in_samples; + } + + void setup_downmix(oe_enc_opt *opt) { + downmix *d = calloc(1, sizeof(downmix)); + + if(opt->channels != 2) { + fprintf(stderr, "Internal error! Please report this bug.\n"); + return; + } + + d->bufs = malloc(2 * sizeof(float *)); + d->bufs[0] = malloc(4096 * sizeof(float)); + d->bufs[1] = malloc(4096 * sizeof(float)); + d->real_reader = opt->read_samples; + + d->real_readdata = opt->readdata; + + opt->read_samples = read_downmix; + opt->readdata = d; + + opt->channels = 1; + } + void clear_downmix(oe_enc_opt *opt) { + downmix *d = opt->readdata; + + opt->read_samples = d->real_reader; + opt->readdata = d->real_readdata; + opt->channels = 2; /* other things in cleanup rely on this */ + + free(d->bufs[0]); + free(d->bufs[1]); + free(d->bufs); + free(d); + } + + /* OggEnc + ** + ** This program is distributed under the GNU General Public License, version 2. + ** A copy of this license is included with this source. + ** + ** Copyright 2000-2002, Michael Smith + ** + ** Portions from Vorbize, (c) Kenneth Arnold + ** and libvorbis examples, (c) Monty + **/ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2001 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: vorbis encode-engine setup + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _OV_ENC_H_ + + extern int vorbis_encode_init(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + + extern int vorbis_encode_setup_managed(vorbis_info *vi, + long channels, + long rate, + + long max_bitrate, + long nominal_bitrate, + long min_bitrate); + + extern int vorbis_encode_setup_vbr(vorbis_info *vi, + long channels, + long rate, + + float /* quality level from 0. (lo) to 1. (hi) */ + ); + + extern int vorbis_encode_init_vbr(vorbis_info *vi, + long channels, + long rate, + + float base_quality /* quality level from 0. (lo) to 1. (hi) */ + ); + + extern int vorbis_encode_setup_init(vorbis_info *vi); + + extern int vorbis_encode_ctl(vorbis_info *vi,int number,void *arg); + + #define OV_ECTL_RATEMANAGE_GET 0x10 + + #define OV_ECTL_RATEMANAGE_SET 0x11 + #define OV_ECTL_RATEMANAGE_AVG 0x12 + #define OV_ECTL_RATEMANAGE_HARD 0x13 + + #define OV_ECTL_LOWPASS_GET 0x20 + #define OV_ECTL_LOWPASS_SET 0x21 + + #define OV_ECTL_IBLOCK_GET 0x30 + #define OV_ECTL_IBLOCK_SET 0x31 + + struct ovectl_ratemanage_arg { + int management_active; + + long bitrate_hard_min; + long bitrate_hard_max; + double bitrate_hard_window; + + long bitrate_av_lo; + long bitrate_av_hi; + double bitrate_av_window; + double bitrate_av_window_center; + }; + + #define READSIZE 1024 + + + int oe_write_page(ogg_page *page, FILE *fp); + + #define SETD(toset) \ + do {\ + if(sscanf(opts[i].val, "%lf", &dval) != 1)\ + fprintf(stderr, "For option %s, couldn't read value %s as double\n",\ + opts[i].arg, opts[i].val);\ + else\ + toset = dval;\ + } while(0) + + #define SETL(toset) \ + do {\ + if(sscanf(opts[i].val, "%ld", &lval) != 1)\ + fprintf(stderr, "For option %s, couldn't read value %s as integer\n",\ + opts[i].arg, opts[i].val);\ + else\ + toset = lval;\ + } while(0) + + static void set_advanced_encoder_options(adv_opt *opts, int count, + vorbis_info *vi) + { + int hard = 0; + int avg = 0; + struct ovectl_ratemanage_arg ai; + int i; + double dval; + long lval; + + vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE_GET, &ai); + + for(i=0; i < count; i++) { + fprintf(stderr, _("Setting advanced encoder option \"%s\" to %s\n"), + opts[i].arg, opts[i].val); + + if(!strcmp(opts[i].arg, "bitrate_average_window")) { + SETD(ai.bitrate_av_window); + avg = 1; + } + else if(!strcmp(opts[i].arg, "bitrate_average_window_center")) { + SETD(ai.bitrate_av_window_center); + avg = 1; + } + else if(!strcmp(opts[i].arg, "bitrate_average_low")) { + SETL(ai.bitrate_av_lo); + avg = 1; + } + else if(!strcmp(opts[i].arg, "bitrate_average_high")) { + SETL(ai.bitrate_av_hi); + avg = 1; + } + else if(!strcmp(opts[i].arg, "bitrate_hard_min")) { + SETL(ai.bitrate_hard_min); + hard = 1; + } + else if(!strcmp(opts[i].arg, "bitrate_hard_max")) { + SETL(ai.bitrate_hard_max); + hard = 1; + } + else if(!strcmp(opts[i].arg, "bitrate_hard_window")) { + SETD(ai.bitrate_hard_window); + hard = 1; + } + else if(!strcmp(opts[i].arg, "impulse_noisetune")) { + double val; + SETD(val); + vorbis_encode_ctl(vi, OV_ECTL_IBLOCK_SET, &val); + } + else if(!strcmp(opts[i].arg, "lowpass_frequency")) { + double prev, new; + SETD(new); + vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_GET, &prev); + vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &new); + fprintf(stderr, _("Changed lowpass frequency from %f kHz to %f kHz\n"), prev, new); + } + else { + fprintf(stderr, _("Unrecognised advanced option \"%s\"\n"), + opts[i].arg); + } + } + + if(hard) + vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE_HARD, &ai); + if(avg) + vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE_AVG, &ai); + } + + int oe_encode(oe_enc_opt *opt) + { + + ogg_stream_state os; + ogg_page og; + ogg_packet op; + + vorbis_dsp_state vd; + vorbis_block vb; + vorbis_info vi; + + long samplesdone=0; + int eos; + long bytes_written = 0, packetsdone=0; + double time_elapsed; + int ret=0; + TIMER *timer; + + if(opt->channels > 255) { + fprintf(stderr, _("255 channels should be enough for anyone. (Sorry, vorbis doesn't support more)\n")); + return 1; + } + + /* get start time. */ + timer = timer_start(); + + if(!opt->managed && (opt->min_bitrate>=0 || opt->max_bitrate>=0)){ + fprintf(stderr, _("Requesting a minimum or maximum bitrate requires --managed\n")); + return 1; + } + + /* if we had no quality or bitrate spec at all from the user, use + the default quality with no management --Monty 20020711 */ + if(opt->bitrate < 0 && opt->min_bitrate < 0 && opt->max_bitrate < 0){ + opt->quality_set=1; + } + + opt->start_encode(opt->infilename, opt->filename, opt->bitrate, opt->quality, + opt->quality_set, opt->managed, opt->min_bitrate, opt->max_bitrate); + + /* Have vorbisenc choose a mode for us */ + vorbis_info_init(&vi); + + if(opt->quality_set > 0){ + if(vorbis_encode_setup_vbr(&vi, opt->channels, opt->rate, opt->quality)){ + fprintf(stderr, _("Mode initialisation failed: invalid parameters for quality\n")); + vorbis_info_clear(&vi); + return 1; + } + + /* do we have optional hard quality restrictions? */ + if(opt->max_bitrate > 0 || opt->min_bitrate > 0){ + struct ovectl_ratemanage_arg ai; + vorbis_encode_ctl(&vi, OV_ECTL_RATEMANAGE_GET, &ai); + + ai.bitrate_hard_min=opt->min_bitrate; + ai.bitrate_hard_max=opt->max_bitrate; + ai.management_active=1; + + vorbis_encode_ctl(&vi, OV_ECTL_RATEMANAGE_SET, &ai); + + } + + + }else { + if(vorbis_encode_setup_managed(&vi, opt->channels, opt->rate, + opt->max_bitrate>0?opt->max_bitrate*1000:-1, + opt->bitrate*1000, + opt->min_bitrate>0?opt->min_bitrate*1000:-1)){ + fprintf(stderr, _("Mode initialisation failed: invalid parameters for bitrate\n")); + vorbis_info_clear(&vi); + return 1; + } + } + + if(opt->managed && opt->bitrate < 0) + { + vorbis_encode_ctl(&vi, OV_ECTL_RATEMANAGE_AVG, NULL); + } + else if(!opt->managed) + { + /* Turn off management entirely (if it was turned on). */ + vorbis_encode_ctl(&vi, OV_ECTL_RATEMANAGE_SET, NULL); + } + + set_advanced_encoder_options(opt->advopt, opt->advopt_count, &vi); + + vorbis_encode_setup_init(&vi); + + + /* Now, set up the analysis engine, stream encoder, and other + preparation before the encoding begins. + */ + + vorbis_analysis_init(&vd,&vi); + vorbis_block_init(&vd,&vb); + + ogg_stream_init(&os, opt->serialno); + + /* Now, build the three header packets and send through to the stream + output stage (but defer actual file output until the main encode loop) */ + + { + ogg_packet header_main; + ogg_packet header_comments; + ogg_packet header_codebooks; + int result; + + /* Build the packets */ + vorbis_analysis_headerout(&vd,opt->comments, + &header_main,&header_comments,&header_codebooks); + + /* And stream them out */ + ogg_stream_packetin(&os,&header_main); + ogg_stream_packetin(&os,&header_comments); + ogg_stream_packetin(&os,&header_codebooks); + + while((result = ogg_stream_flush(&os, &og))) + { + if(!result) break; + ret = oe_write_page(&og, opt->out); + if(ret != og.header_len + og.body_len) + { + opt->error(_("Failed writing header to output stream\n")); + ret = 1; + goto cleanup; /* Bail and try to clean up stuff */ + } + } + } + + eos = 0; + + /* Main encode loop - continue until end of file */ + while(!eos) + { + float **buffer = vorbis_analysis_buffer(&vd, READSIZE); + long samples_read = opt->read_samples(opt->readdata, + buffer, READSIZE); + + if(samples_read ==0) + /* Tell the library that we wrote 0 bytes - signalling the end */ + vorbis_analysis_wrote(&vd,0); + else + { + samplesdone += samples_read; + + /* Call progress update every 40 pages */ + if(packetsdone>=40) + { + double time; + + packetsdone = 0; + time = timer_time(timer); + + opt->progress_update(opt->filename, opt->total_samples_per_channel, + samplesdone, time); + } + + /* Tell the library how many samples (per channel) we wrote + into the supplied buffer */ + vorbis_analysis_wrote(&vd, samples_read); + } + + /* While we can get enough data from the library to analyse, one + block at a time... */ + while(vorbis_analysis_blockout(&vd,&vb)==1) + { + + /* Do the main analysis, creating a packet */ + vorbis_analysis(&vb, NULL); + vorbis_bitrate_addblock(&vb); + + while(vorbis_bitrate_flushpacket(&vd, &op)) + { + /* Add packet to bitstream */ + ogg_stream_packetin(&os,&op); + packetsdone++; + + /* If we've gone over a page boundary, we can do actual output, + so do so (for however many pages are available) */ + + while(!eos) + { + int result = ogg_stream_pageout(&os,&og); + if(!result) break; + + ret = oe_write_page(&og, opt->out); + if(ret != og.header_len + og.body_len) + { + opt->error(_("Failed writing data to output stream\n")); + ret = 1; + goto cleanup; /* Bail */ + } + else + bytes_written += ret; + + if(ogg_page_eos(&og)) + eos = 1; + } + } + } + } + + ret = 0; /* Success, set return value to 0 since other things reuse it + * for nefarious purposes. */ + + /* Cleanup time */ + cleanup: + + ogg_stream_clear(&os); + + vorbis_block_clear(&vb); + vorbis_dsp_clear(&vd); + vorbis_info_clear(&vi); + + time_elapsed = timer_time(timer); + opt->end_encode(opt->filename, time_elapsed, opt->rate, samplesdone, bytes_written); + + timer_clear(timer); + + return ret; + } + + void update_statistics_full(char *fn, long total, long done, double time) + { + static char *spinner="|/-\\"; + static int spinpoint = 0; + double remain_time; + int minutes=0,seconds=0; + + remain_time = time/((double)done/(double)total) - time; + minutes = ((int)remain_time)/60; + seconds = (int)(remain_time - (double)((int)remain_time/60)*60); + + fprintf(stderr, "\r"); + fprintf(stderr, _("\t[%5.1f%%] [%2dm%.2ds remaining] %c"), + done*100.0/total, minutes, seconds, spinner[spinpoint++%4]); + } + + void update_statistics_notime(char *fn, long total, long done, double time) + { + static char *spinner="|/-\\"; + static int spinpoint =0; + + fprintf(stderr, "\r"); + fprintf(stderr, _("\tEncoding [%2dm%.2ds so far] %c"), + ((int)time)/60, (int)(time - (double)((int)time/60)*60), + spinner[spinpoint++%4]); + } + + int oe_write_page(ogg_page *page, FILE *fp) + { + int written; + written = fwrite(page->header,1,page->header_len, fp); + written += fwrite(page->body,1,page->body_len, fp); + + return written; + } + + void final_statistics(char *fn, double time, int rate, long samples, long bytes) + { + double speed_ratio; + if(fn) + fprintf(stderr, _("\n\nDone encoding file \"%s\"\n"), fn); + else + fprintf(stderr, _("\n\nDone encoding.\n")); + + speed_ratio = (double)samples / (double)rate / time; + + fprintf(stderr, _("\n\tFile length: %dm %04.1fs\n"), + (int)(samples/rate/60), + samples/rate - + floor(samples/rate/60)*60); + fprintf(stderr, _("\tElapsed time: %dm %04.1fs\n"), + (int)(time/60), + time - floor(time/60)*60); + fprintf(stderr, _("\tRate: %.4f\n"), speed_ratio); + fprintf(stderr, _("\tAverage bitrate: %.1f kb/s\n\n"), + 8./1000.*((double)bytes/((double)samples/(double)rate))); + } + + void final_statistics_null(char *fn, double time, int rate, long samples, + long bytes) + { + /* Don't do anything, this is just a placeholder function for quiet mode */ + } + + void update_statistics_null(char *fn, long total, long done, double time) + { + /* So is this */ + } + + void encode_error(char *errmsg) + { + fprintf(stderr, "\n%s\n", errmsg); + } + + static void print_brconstraints(int min, int max) + { + if(min > 0 && max > 0) + fprintf(stderr, "(min %d kbps, max %d kbps)", min,max); + else if(min > 0) + fprintf(stderr, "(min %d kbps, no max)", min); + else if(max > 0) + fprintf(stderr, "(no min, max %d kbps)", max); + else + fprintf(stderr, "(no min or max)"); + } + + void start_encode_full(char *fn, char *outfn, int bitrate, float quality, int qset, + int managed, int min, int max) + { + if(bitrate>0){ + if(managed>0){ + fprintf(stderr, _("Encoding %s%s%s to \n " + "%s%s%s \nat average bitrate %d kbps "), + fn?"\"":"", fn?fn:_("standard input"), fn?"\"":"", + outfn?"\"":"", outfn?outfn:_("standard output"), outfn?"\"":"", + bitrate); + print_brconstraints(min,max); + fprintf(stderr, ", \nusing full bitrate management engine\n"); + } else { + fprintf(stderr, _("Encoding %s%s%s to \n %s%s%s \nat approximate bitrate %d kbps (VBR encoding enabled)\n"), + fn?"\"":"", fn?fn:_("standard input"), fn?"\"":"", + outfn?"\"":"", outfn?outfn:_("standard output"), outfn?"\"":"", + bitrate); + } + }else{ + if(qset>0){ + if(managed>0){ + fprintf(stderr, _("Encoding %s%s%s to \n %s%s%s \nat quality level %2.2f using constrained VBR "), + fn?"\"":"", fn?fn:_("standard input"), fn?"\"":"", + outfn?"\"":"", outfn?outfn:_("standard output"), outfn?"\"":"", + quality * 10); + print_brconstraints(min,max); + fprintf(stderr, "\n"); + }else{ + fprintf(stderr, _("Encoding %s%s%s to \n %s%s%s \nat quality %2.2f\n"), + fn?"\"":"", fn?fn:_("standard input"), fn?"\"":"", + outfn?"\"":"", outfn?outfn:_("standard output"), outfn?"\"":"", + quality * 10); + } + }else{ + fprintf(stderr, _("Encoding %s%s%s to \n %s%s%s \nusing bitrate management "), + fn?"\"":"", fn?fn:_("standard input"), fn?"\"":"", + outfn?"\"":"", outfn?outfn:_("standard output"), outfn?"\"":""); + print_brconstraints(min,max); + fprintf(stderr, "\n"); + } + } + } + + void start_encode_null(char *fn, char *outfn, int bitrate, float quality, int qset, + int managed, int min, int max) + { + } + + + /* OggEnc + ** + ** This program is distributed under the GNU General Public License, version 2. + ** A copy of this license is included with this source. + ** + ** Copyright 2000, Michael Smith + ** + ** Portions from Vorbize, (c) Kenneth Arnold + ** and libvorbis examples, (c) Monty + **/ + + /* Platform support routines - win32, OS/2, unix */ + + + #if defined(_WIN32) && defined(_MSC_VER) + + void setbinmode(FILE *f) + { + _setmode( _fileno(f), _O_BINARY ); + } + #endif /* win32 */ + + #ifdef __EMX__ + void setbinmode(FILE *f) + { + _fsetmode( f, "b"); + } + #endif + + #if defined(__WATCOMC__) || defined(__BORLANDC__) + void setbinmode(FILE *f) + { + setmode(fileno(f), O_BINARY); + } + #endif + + + #if defined(_WIN32) || defined(__EMX__) || defined(__WATCOMC__) + void *timer_start(void) + { + time_t *start = malloc(sizeof(time_t)); + time(start); + return (void *)start; + } + + double timer_time(void *timer) + { + time_t now = time(NULL); + time_t start = *((time_t *)timer); + + if(now-start) + return (double)(now-start); + else + return 1; /* To avoid division by zero later, for very short inputs */ + } + + + void timer_clear(void *timer) + { + free((time_t *)timer); + } + + #else /* unix. Or at least win32 */ + + void *timer_start(void) + { + struct timeval *start = malloc(sizeof(struct timeval)); + gettimeofday(start, NULL); + return (void *)start; + } + + double timer_time(void *timer) + { + struct timeval now; + struct timeval start = *((struct timeval *)timer); + + gettimeofday(&now, NULL); + + return (double)now.tv_sec - (double)start.tv_sec + + ((double)now.tv_usec - (double)start.tv_usec)/1000000.0; + } + + void timer_clear(void *timer) + { + free((time_t *)timer); + } + + #endif + + #ifdef _WIN32 + + #define PATH_SEPS "/\\" + #define mkdir(x,y) _mkdir((x)) + + /* MSVC does this, borland doesn't? */ + #ifndef __BORLANDC__ + #define stat _stat + #endif + + #else + + #define PATH_SEPS "/" + + #endif + + int create_directories(char *fn) + { + char *end, *start; + struct stat statbuf; + char *segment = malloc(strlen(fn)+1); + + start = fn; + #ifdef _WIN32 + if(strlen(fn) >= 3 && isalpha(fn[0]) && fn[1]==':') + start = start+2; + #endif + + while((end = strpbrk(start+1, PATH_SEPS)) != NULL) + { + memcpy(segment, fn, end-fn); + segment[end-fn] = 0; + + if(stat(segment,&statbuf)) { + if(errno == ENOENT) { + if(mkdir(segment, 0777)) { + fprintf(stderr, _("Couldn't create directory \"%s\": %s\n"), + segment, strerror(errno)); + free(segment); + return -1; + } + } + else { + fprintf(stderr, _("Error checking for existence of directory %s: %s\n"), + segment, strerror(errno)); + free(segment); + return -1; + } + } + #if defined(_WIN32) && !defined(__BORLANDC__) + else if(!(_S_IFDIR & statbuf.st_mode)) { + #elif defined(__BORLANDC__) + else if(!(S_IFDIR & statbuf.st_mode)) { + #else + else if(!S_ISDIR(statbuf.st_mode)) { + #endif + fprintf(stderr, _("Error: path segment \"%s\" is not a directory\n"), + segment); + free(segment); + return -1; + } + + start = end+1; + } + + free(segment); + return 0; + + } + + + + /* resample.c: see resample.h for interesting stuff */ + + + /* Some systems don't define this */ + #ifndef M_PI + #define M_PI 3.14159265358979323846 + #endif + + static int hcf(int arg1, int arg2) + { + int mult = 1; + + while (~(arg1 | arg2) & 1) + arg1 >>= 1, arg2 >>= 1, mult <<= 1; + + while (arg1 > 0) + { + if (~(arg1 & arg2) & 1) + { + arg1 >>= (~arg1 & 1); + arg2 >>= (~arg2 & 1); + } + else if (arg1 < arg2) + arg2 = (arg2 - arg1) >> 1; + else + arg1 = (arg1 - arg2) >> 1; + } + + return arg2 * mult; + } + + + static void filt_sinc(float *dest, int N, int step, double fc, double gain, int width) + { + double s = fc / step; + int mid, x; + float *endpoint = dest + N, + *base = dest, + *origdest = dest; + + assert(width <= N); + + if ((N & 1) == 0) + { + *dest = 0.0; + dest += width; + if (dest >= endpoint) + dest = ++base; + N--; + } + + mid = N / 2; + x = -mid; + + while (N--) + { + *dest = (x ? sin(x * M_PI * s) / (x * M_PI) * step : fc) * gain; + x++; + dest += width; + if (dest >= endpoint) + dest = ++base; + } + assert(dest == origdest + width); + } + + + static double I_zero(double x) + { + int n = 0; + double u = 1.0, + s = 1.0, + t; + + do + { + n += 2; + t = x / n; + u *= t * t; + s += u; + } while (u > 1e-21 * s); + + return s; + } + + + static void win_kaiser(float *dest, int N, double alpha, int width) + { + double I_alpha, midsq; + int x; + float *endpoint = dest + N, + *base = dest, + *origdest = dest; + + assert(width <= N); + + if ((N & 1) == 0) + { + *dest = 0.0; + dest += width; + if (dest >= endpoint) + dest = ++base; + N--; + } + + x = -(N / 2); + midsq = (double)(x - 1) * (double)(x - 1); + I_alpha = I_zero(alpha); + + while (N--) + { + *dest *= I_zero(alpha * sqrt(1.0 - ((double)x * (double)x) / midsq)) / I_alpha; + x++; + dest += width; + if (dest >= endpoint) + dest = ++base; + } + assert(dest == origdest + width); + } + + + int res_init(res_state *state, int channels, int outfreq, int infreq, res_parameter op1, ...) + { + double beta = 16.0, + cutoff = 0.80, + gain = 1.0; + int taps = 45; + + int factor; + + assert(state); + assert(channels > 0); + assert(outfreq > 0); + assert(infreq > 0); + assert(taps > 0); + + if (state == NULL || channels <= 0 || outfreq <= 0 || infreq <= 0 || taps <= 0) + return -1; + + if (op1 != RES_END) + { + va_list argp; + va_start(argp, op1); + do + { + switch (op1) + { + case RES_GAIN: + gain = va_arg(argp, double); + break; + + case RES_CUTOFF: + cutoff = va_arg(argp, double); + assert(cutoff > 0.01 && cutoff <= 1.0); + break; + + case RES_TAPS: + taps = va_arg(argp, int); + assert(taps > 2 && taps < 1000); + break; + + case RES_BETA: + beta = va_arg(argp, double); + assert(beta > 2.0); + break; + default: + assert("arglist" == "valid"); + return -1; + } + op1 = va_arg(argp, res_parameter); + } while (op1 != RES_END); + va_end(argp); + } + + factor = hcf(infreq, outfreq); + outfreq /= factor; + infreq /= factor; + + /* adjust to rational values for downsampling */ + if (outfreq < infreq) + { + /* push the cutoff frequency down to the output frequency */ + cutoff = cutoff * outfreq / infreq; + + /* compensate for the sharper roll-off requirement + * by using a bigger hammer */ + taps = taps * infreq/outfreq; + } + + assert(taps >= (infreq + outfreq - 1) / outfreq); + + if ((state->table = calloc(outfreq * taps, sizeof(float))) == NULL) + return -1; + if ((state->pool = calloc(channels * taps, sizeof(SAMPLE))) == NULL) + { + free(state->table); + state->table = NULL; + return -1; + } + + state->poolfill = taps / 2 + 1; + state->channels = channels; + state->outfreq = outfreq; + state->infreq = infreq; + state->taps = taps; + state->offset = 0; + + filt_sinc(state->table, outfreq * taps, outfreq, cutoff, gain, taps); + win_kaiser(state->table, outfreq * taps, beta, taps); + + return 0; + } + + + static SAMPLE sum(float const *scale, int count, SAMPLE const *source, SAMPLE const *trigger, SAMPLE const *reset, int srcstep) + { + float total = 0.0; + + while (count--) + { + total += *source * *scale; + + if (source == trigger) + source = reset, srcstep = 1; + source -= srcstep; + scale++; + } + + return total; + } + + + static int push(res_state const * const state, SAMPLE *pool, int * const poolfill, int * const offset, SAMPLE *dest, int dststep, SAMPLE const *source, int srcstep, size_t srclen) + { + SAMPLE * const destbase = dest, + *poolhead = pool + *poolfill, + *poolend = pool + state->taps, + *newpool = pool; + SAMPLE const *refill, *base, *endpoint; + int lencheck; + + + assert(state); + assert(pool); + assert(poolfill); + assert(dest); + assert(source); + + assert(state->poolfill != -1); + + lencheck = res_push_check(state, srclen); + + /* fill the pool before diving in */ + while (poolhead < poolend && srclen > 0) + { + *poolhead++ = *source; + source += srcstep; + srclen--; + } + + if (srclen <= 0) + return 0; + + base = source; + endpoint = source + srclen * srcstep; + + while (source < endpoint) + { + *dest = sum(state->table + *offset * state->taps, state->taps, source, base, poolend, srcstep); + dest += dststep; + *offset += state->infreq; + while (*offset >= state->outfreq) + { + *offset -= state->outfreq; + source += srcstep; + } + } + + assert(dest == destbase + lencheck * dststep); + + /* pretend that source has that underrun data we're not going to get */ + srclen += (source - endpoint) / srcstep; + + /* if we didn't get enough to completely replace the pool, then shift things about a bit */ + if (srclen < state->taps) + { + refill = pool + srclen; + while (refill < poolend) + *newpool++ = *refill++; + + refill = source - srclen * srcstep; + } + else + refill = source - state->taps * srcstep; + + /* pull in fresh pool data */ + while (refill < endpoint) + { + *newpool++ = *refill; + refill += srcstep; + } + + assert(newpool > pool); + assert(newpool <= poolend); + + *poolfill = newpool - pool; + + return (dest - destbase) / dststep; + } + + + int res_push_max_input(res_state const * const state, size_t maxoutput) + { + return maxoutput * state->infreq / state->outfreq; + } + + + int res_push_check(res_state const * const state, size_t srclen) + { + if (state->poolfill < state->taps) + srclen -= state->taps - state->poolfill; + + return (srclen * state->outfreq - state->offset + state->infreq - 1) / state->infreq; + } + + + int res_push(res_state *state, SAMPLE **dstlist, SAMPLE const **srclist, size_t srclen) + { + int result = -1, poolfill = -1, offset = -1, i; + + assert(state); + assert(dstlist); + assert(srclist); + assert(state->poolfill >= 0); + + for (i = 0; i < state->channels; i++) + { + poolfill = state->poolfill; + offset = state->offset; + result = push(state, state->pool + i * state->taps, &poolfill, &offset, dstlist[i], 1, srclist[i], 1, srclen); + } + state->poolfill = poolfill; + state->offset = offset; + + return result; + } + + + int res_push_interleaved(res_state *state, SAMPLE *dest, SAMPLE const *source, size_t srclen) + { + int result = -1, poolfill = -1, offset = -1, i; + + assert(state); + assert(dest); + assert(source); + assert(state->poolfill >= 0); + + for (i = 0; i < state->channels; i++) + { + poolfill = state->poolfill; + offset = state->offset; + result = push(state, state->pool + i * state->taps, &poolfill, &offset, dest + i, state->channels, source + i, state->channels, srclen); + } + state->poolfill = poolfill; + state->offset = offset; + + return result; + } + + + int res_drain(res_state *state, SAMPLE **dstlist) + { + SAMPLE *tail; + int result = -1, poolfill = -1, offset = -1, i; + + assert(state); + assert(dstlist); + assert(state->poolfill >= 0); + + if ((tail = calloc(state->taps, sizeof(SAMPLE))) == NULL) + return -1; + + for (i = 0; i < state->channels; i++) + { + poolfill = state->poolfill; + offset = state->offset; + result = push(state, state->pool + i * state->taps, &poolfill, &offset, dstlist[i], 1, tail, 1, state->taps / 2 - 1); + } + + free(tail); + + state->poolfill = -1; + + return result; + } + + + int res_drain_interleaved(res_state *state, SAMPLE *dest) + { + SAMPLE *tail; + int result = -1, poolfill = -1, offset = -1, i; + + assert(state); + assert(dest); + assert(state->poolfill >= 0); + + if ((tail = calloc(state->taps, sizeof(SAMPLE))) == NULL) + return -1; + + for (i = 0; i < state->channels; i++) + { + poolfill = state->poolfill; + offset = state->offset; + result = push(state, state->pool + i * state->taps, &poolfill, &offset, dest + i, state->channels, tail, 1, state->taps / 2 - 1); + } + + free(tail); + + state->poolfill = -1; + + return result; + } + + + void res_clear(res_state *state) + { + assert(state); + assert(state->table); + assert(state->pool); + + free(state->table); + free(state->pool); + memset(state, 0, sizeof(*state)); + } + + /* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper at gnu.org + before changing it! + + Copyright (C) 1987, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 + Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + + /* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + + /* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + + /* Names for the values of the `has_arg' field of `struct option'. */ + + /* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + + char *optarg; + + /* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + + /* 1003.2 says this must be 1 before any call. */ + int optind = 1; + + /* Formerly, initialization of getopt depended on optind==0, which + causes problems with re-calling getopt as programs generally don't + know that. */ + + int __getopt_initialized; + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + + static char *nextchar; + + /* Callers store zero here to inhibit the error message + for unrecognized options. */ + + int opterr = 1; + + /* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + + int optopt = '?'; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we scan, + so that eventually all the non-options are at the end. This allows options + to be given in any order, even with programs that were not written to + expect this. + + RETURN_IN_ORDER is an option available to programs that were written + to expect options and other ARGV-elements in any order and that care about + the ordering of the two. We describe each non-option ARGV-element + as if it were the argument of an option with character code 1. + Using `-' as the first character of the list of option characters + selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + + static enum + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } ordering; + + /* Value of POSIXLY_CORRECT environment variable. */ + static char *posixly_correct; + + #ifdef __GNU_LIBRARY__ + /* We want to avoid inclusion of string.h with non-GNU libraries + because there are many ways it can cause trouble. + On some systems, it contains special magic macros that don't work + in GCC. */ + # define my_index strchr + #else + + /* Avoid depending on library functions or files + whose names are inconsistent. */ + + #ifndef getenv + extern char *getenv (); + #endif + + static char * + my_index (str, chr) + const char *str; + int chr; + { + while (*str) + { + if (*str == chr) + return (char *) str; + str++; + } + return 0; + } + + /* If using GCC, we can safely declare strlen this way. + If not using GCC, it is ok not to declare it. */ + #ifdef __GNUC__ + /* Note that Motorola Delta 68k R3V7 comes with GCC but not stddef.h. + That was relevant to code that was here before. */ + # if (!defined __STDC__ || !__STDC__) && !defined strlen + /* gcc with -traditional declares the built-in strlen to return int, + and has done so at least since version 2.4.5. -- rms. */ + extern int strlen (const char *); + # endif /* not __STDC__ */ + #endif /* __GNUC__ */ + + #endif /* not __GNU_LIBRARY__ */ + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first of them; + `last_nonopt' is the index after the last of them. */ + + static int first_nonopt; + static int last_nonopt; + + #ifdef _LIBC + /* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + + /* Defined in getopt_init.c */ + extern char *__getopt_nonoption_flags; + + static int nonoption_flags_max_len; + static int nonoption_flags_len; + + static int original_argc; + static char *const *original_argv; + + /* Make sure the environment variable bash 2.0 puts in the environment + is valid for the getopt call we must make sure that the ARGV passed + to getopt is that one passed to the process. */ + static void + __attribute__ ((unused)) + store_args_and_env (int argc, char *const *argv) + { + /* XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ + original_argc = argc; + original_argv = argv; + } + # ifdef text_set_element + text_set_element (__libc_subinit, store_args_and_env); + # endif /* text_set_element */ + + # define SWAP_FLAGS(ch1, ch2) \ + if (nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } + #else /* !_LIBC */ + # define SWAP_FLAGS(ch1, ch2) + #endif /* _LIBC */ + + /* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + + #if defined __STDC__ && __STDC__ + static void exchange (char **); + #endif + + static void + exchange (argv) + char **argv; + { + int bottom = first_nonopt; + int middle = last_nonopt; + int top = optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + + #ifdef _LIBC + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (nonoption_flags_len > 0 && top >= nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + nonoption_flags_len = nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + nonoption_flags_max_len), + '\0', top + 1 - nonoption_flags_max_len); + nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } + #endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + first_nonopt += (optind - last_nonopt); + last_nonopt = optind; + } + + /* Initialize the internal data when the first call is made. */ + + #if defined __STDC__ && __STDC__ + static const char *_getopt_initialize (int, char *const *, const char *); + #endif + static const char * + _getopt_initialize (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; + { + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + first_nonopt = last_nonopt = optind; + + nextchar = NULL; + + posixly_correct = getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + ordering = REQUIRE_ORDER; + ++optstring; + } + else if (posixly_correct != NULL) + ordering = REQUIRE_ORDER; + else + ordering = PERMUTE; + + #ifdef _LIBC + if (posixly_correct == NULL + && argc == original_argc && argv == original_argv) + { + if (nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = nonoption_flags_max_len = strlen (orig_str); + if (nonoption_flags_max_len < argc) + nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', nonoption_flags_max_len - len); + } + } + nonoption_flags_len = nonoption_flags_max_len; + } + else + nonoption_flags_len = 0; + #endif + + return optstring; + } + + /* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + + int + _getopt_internal (argc, argv, optstring, longopts, longind, long_only) + int argc; + char *const *argv; + const char *optstring; + const struct option *longopts; + int *longind; + int long_only; + { + optarg = NULL; + + if (optind == 0 || !__getopt_initialized) + { + if (optind == 0) + optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring); + __getopt_initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ + #ifdef _LIBC + # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0' \ + || (optind < nonoption_flags_len \ + && __getopt_nonoption_flags[optind] == '1')) + #else + # define NONOPTION_P (argv[optind][0] != '-' || argv[optind][1] == '\0') + #endif + + if (nextchar == NULL || *nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (last_nonopt > optind) + last_nonopt = optind; + if (first_nonopt > optind) + first_nonopt = optind; + + if (ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (last_nonopt != optind) + first_nonopt = optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (optind < argc && NONOPTION_P) + optind++; + last_nonopt = optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (optind != argc && !strcmp (argv[optind], "--")) + { + optind++; + + if (first_nonopt != last_nonopt && last_nonopt != optind) + exchange ((char **) argv); + else if (first_nonopt == last_nonopt) + first_nonopt = optind; + last_nonopt = argc; + + optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (first_nonopt != last_nonopt) + optind = first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (ordering == REQUIRE_ORDER) + return -1; + optarg = argv[optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + nextchar = (argv[optind] + 1 + + (longopts != NULL && argv[optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[optind][1] == '-' + || (long_only && (argv[optind][2] || !my_index (optstring, argv[optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + { + if (argv[optind - 1][1] == '-') + /* --option */ + fprintf (stderr, + _("%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); + else + /* +option or -option */ + fprintf (stderr, + _("%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[optind - 1][0], pfound->name); + } + + nextchar += strlen (nextchar); + + optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[optind][1] == '-' + || my_index (optstring, *nextchar) == NULL) + { + if (opterr) + { + if (argv[optind][1] == '-') + /* --option */ + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], nextchar); + else + /* +option or -option */ + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[optind][0], nextchar); + } + nextchar = (char *) ""; + optind++; + optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *nextchar++; + char *temp = my_index (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*nextchar == '\0') + ++optind; + + if (temp == NULL || c == ':') + { + if (opterr) + { + if (posixly_correct) + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: illegal option -- %c\n"), + argv[0], c); + else + fprintf (stderr, _("%s: invalid option -- %c\n"), + argv[0], c); + } + optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (nextchar = nameend = optarg; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, nextchar, nameend - nextchar)) + { + if ((unsigned int) (nameend - nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (opterr) + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[optind]); + nextchar += strlen (nextchar); + optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + optarg = nameend + 1; + else + { + if (opterr) + fprintf (stderr, _("\ + %s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); + + nextchar += strlen (nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (optind < argc) + optarg = argv[optind++]; + else + { + if (opterr) + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[optind - 1]); + nextchar += strlen (nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + nextchar += strlen (nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*nextchar != '\0') + { + optarg = nextchar; + optind++; + } + else + optarg = NULL; + nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*nextchar != '\0') + { + optarg = nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + optind++; + } + else if (optind == argc) + { + if (opterr) + { + /* 1003.2 specifies the format of this message. */ + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); + } + optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + optarg = argv[optind++]; + nextchar = NULL; + } + } + return c; + } + } + + int + getopt (argc, argv, optstring) + int argc; + char *const *argv; + const char *optstring; + { + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); + } + + int + getopt_long (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; + { + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); + } + + int + getopt_long_only (argc, argv, options, long_options, opt_index) + int argc; + char *const *argv; + const char *options; + const struct option *long_options; + int *opt_index; + { + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); + } + + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: simple programmatic interface for encoder mode setup + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis codec headers + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _V_CODECI_H_ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: PCM data envelope analysis and manipulation + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _V_ENVELOPE_ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: modified discrete cosine transform prototypes + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _OGG_mdct_H_ + + /*#define MDCT_INTEGERIZED <- be warned there could be some hurt left here*/ + #ifdef MDCT_INTEGERIZED + + #define DATA_TYPE int + #define REG_TYPE register int + #define TRIGBITS 14 + #define cPI3_8 6270 + #define cPI2_8 11585 + #define cPI1_8 15137 + + #define FLOAT_CONV(x) ((int)((x)*(1<>TRIGBITS) + #define HALVE(x) ((x)>>1) + + #else + + #define DATA_TYPE float + #define REG_TYPE float + #define cPI3_8 .38268343236508977175F + #define cPI2_8 .70710678118654752441F + #define cPI1_8 .92387953251128675613F + + #define FLOAT_CONV(x) (x) + #define MULT_NORM(x) (x) + #define HALVE(x) ((x)*.5f) + + #endif + + + typedef struct { + int n; + int log2n; + + DATA_TYPE *trig; + int *bitrev; + + DATA_TYPE scale; + } mdct_lookup; + + extern void mdct_init(mdct_lookup *lookup,int n); + extern void mdct_clear(mdct_lookup *l); + extern void mdct_forward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); + extern void mdct_backward(mdct_lookup *init, DATA_TYPE *in, DATA_TYPE *out); + + + #define VE_PRE 16 + #define VE_WIN 4 + #define VE_POST 2 + #define VE_AMP (VE_PRE+VE_POST-1) + + #define VE_BANDS 7 + #define VE_NEARDC 15 + + #define VE_MINSTRETCH 2 /* a bit less than short block */ + #define VE_MAXSTRETCH 12 /* one-third full block */ + + typedef struct { + float ampbuf[VE_AMP]; + int ampptr; + + float nearDC[VE_NEARDC]; + float nearDC_acc; + float nearDC_partialacc; + int nearptr; + + } envelope_filter_state; + + typedef struct { + int begin; + int end; + float *window; + float total; + } envelope_band; + + typedef struct { + int ch; + int winlength; + int searchstep; + float minenergy; + + mdct_lookup mdct; + float *mdct_win; + + envelope_band band[VE_BANDS]; + envelope_filter_state *filter; + int stretch; + + int *mark; + + long storage; + long current; + long curmark; + long cursor; + } envelope_lookup; + + extern void _ve_envelope_init(envelope_lookup *e,vorbis_info *vi); + extern void _ve_envelope_clear(envelope_lookup *e); + extern long _ve_envelope_search(vorbis_dsp_state *v); + extern void _ve_envelope_shift(envelope_lookup *e,long shift); + extern int _ve_envelope_mark(vorbis_dsp_state *v); + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: basic shared codebook operations + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _V_CODEBOOK_H_ + + /* This structure encapsulates huffman and VQ style encoding books; it + doesn't do anything specific to either. + + valuelist/quantlist are nonNULL (and q_* significant) only if + there's entry->value mapping to be done. + + If encode-side mapping must be done (and thus the entry needs to be + hunted), the auxiliary encode pointer will point to a decision + tree. This is true of both VQ and huffman, but is mostly useful + with VQ. + + */ + + typedef struct static_codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long *lengthlist; /* codeword lengths in bits */ + + /* mapping ***************************************************************/ + int maptype; /* 0=none + 1=implicitly populated values from map column + 2=listed arbitrary values */ + + /* The below does a linear, single monotonic sequence mapping. */ + long q_min; /* packed 32 bit float; quant value 0 maps to minval */ + long q_delta; /* packed 32 bit float; val 1 - val 0 == delta */ + int q_quant; /* bits: 0 < quant <= 16 */ + int q_sequencep; /* bitflag */ + + long *quantlist; /* map == 1: (int)(entries^(1/dim)) element column map + map == 2: list of dim*entries quantized entry vals + */ + + /* encode helpers ********************************************************/ + struct encode_aux_nearestmatch *nearest_tree; + struct encode_aux_threshmatch *thresh_tree; + struct encode_aux_pigeonhole *pigeon_tree; + + int allocedp; + } static_codebook; + + /* this structures an arbitrary trained book to quickly find the + nearest cell match */ + typedef struct encode_aux_nearestmatch{ + /* pre-calculated partitioning tree */ + long *ptr0; + long *ptr1; + + long *p; /* decision points (each is an entry) */ + long *q; /* decision points (each is an entry) */ + long aux; /* number of tree entries */ + long alloc; + } encode_aux_nearestmatch; + + /* assumes a maptype of 1; encode side only, so that's OK */ + typedef struct encode_aux_threshmatch{ + float *quantthresh; + long *quantmap; + int quantvals; + int threshvals; + } encode_aux_threshmatch; + + typedef struct encode_aux_pigeonhole{ + float min; + float del; + + int mapentries; + int quantvals; + long *pigeonmap; + + long fittotal; + long *fitlist; + long *fitmap; + long *fitlength; + } encode_aux_pigeonhole; + + typedef struct codebook{ + long dim; /* codebook dimensions (elements per vector) */ + long entries; /* codebook entries */ + long used_entries; /* populated codebook entries */ + const static_codebook *c; + + /* for encode, the below are entry-ordered, fully populated */ + /* for decode, the below are ordered by bitreversed codeword and only + used entries are populated */ + float *valuelist; /* list of dim*entries actual entry values */ + ogg_uint32_t *codelist; /* list of bitstream codewords for each entry */ + + int *dec_index; /* only used if sparseness collapsed */ + char *dec_codelengths; + ogg_uint32_t *dec_firsttable; + int dec_firsttablen; + int dec_maxlength; + + } codebook; + + extern void vorbis_staticbook_clear(static_codebook *b); + extern void vorbis_staticbook_destroy(static_codebook *b); + extern int vorbis_book_init_encode(codebook *dest,const static_codebook *source); + extern int vorbis_book_init_decode(codebook *dest,const static_codebook *source); + extern void vorbis_book_clear(codebook *b); + + extern float *_book_unquantize(const static_codebook *b,int n,int *map); + extern float *_book_logdist(const static_codebook *b,float *vals); + extern float _float32_unpack(long val); + extern long _float32_pack(float val); + extern int _best(codebook *book, float *a, int step); + extern int _ilog(unsigned int v); + extern long _book_maptype1_quantvals(const static_codebook *b); + + extern int vorbis_book_besterror(codebook *book,float *a,int step,int addmul); + extern long vorbis_book_codeword(codebook *book,int entry); + extern long vorbis_book_codelen(codebook *book,int entry); + + + + extern int vorbis_staticbook_pack(const static_codebook *c,oggpack_buffer *b); + extern int vorbis_staticbook_unpack(oggpack_buffer *b,static_codebook *c); + + extern int vorbis_book_encode(codebook *book, int a, oggpack_buffer *b); + extern int vorbis_book_errorv(codebook *book, float *a); + extern int vorbis_book_encodev(codebook *book, int best,float *a, + oggpack_buffer *b); + + extern long vorbis_book_decode(codebook *book, oggpack_buffer *b); + extern long vorbis_book_decodevs_add(codebook *book, float *a, + oggpack_buffer *b,int n); + extern long vorbis_book_decodev_set(codebook *book, float *a, + oggpack_buffer *b,int n); + extern long vorbis_book_decodev_add(codebook *book, float *a, + oggpack_buffer *b,int n); + extern long vorbis_book_decodevv_add(codebook *book, float **a, + long off,int ch, + oggpack_buffer *b,int n); + + #define BLOCKTYPE_IMPULSE 0 + #define BLOCKTYPE_PADDING 1 + #define BLOCKTYPE_TRANSITION 0 + #define BLOCKTYPE_LONG 1 + + #define PACKETBLOBS 15 + + typedef struct vorbis_block_internal{ + float **pcmdelay; /* this is a pointer into local storage */ + float ampmax; + int blocktype; + + ogg_uint32_t packetblob_markers[PACKETBLOBS]; + } vorbis_block_internal; + + typedef void vorbis_look_floor; + typedef void vorbis_look_residue; + typedef void vorbis_look_transform; + + /* mode ************************************************************/ + typedef struct { + int blockflag; + int windowtype; + int transformtype; + int mapping; + } vorbis_info_mode; + + typedef void vorbis_info_floor; + typedef void vorbis_info_residue; + typedef void vorbis_info_mapping; + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: random psychoacoustics (not including preecho) + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _V_PSY_H_ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: fft transform + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + #define _V_SMFT_H_ + + + typedef struct { + int n; + float *trigcache; + int *splitcache; + } drft_lookup; + + extern void drft_forward(drft_lookup *l,float *data); + extern void drft_backward(drft_lookup *l,float *data); + extern void drft_init(drft_lookup *l,int n); + extern void drft_clear(drft_lookup *l); + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: libvorbis backend and mapping structures; needed for + static mode headers + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + /* this is exposed up here because we need it for static modes. + Lookups for each backend aren't exposed because there's no reason + to do so */ + + #define _vorbis_backend_h_ + + /* this would all be simpler/shorter with templates, but.... */ + /* Floor backend generic *****************************************/ + typedef struct{ + void (*pack) (vorbis_info_floor *,oggpack_buffer *); + vorbis_info_floor *(*unpack)(vorbis_info *,oggpack_buffer *); + vorbis_look_floor *(*look) (vorbis_dsp_state *,vorbis_info_floor *); + void (*free_info) (vorbis_info_floor *); + void (*free_look) (vorbis_look_floor *); + void *(*inverse1) (struct vorbis_block *,vorbis_look_floor *); + int (*inverse2) (struct vorbis_block *,vorbis_look_floor *, + void *buffer,float *); + } vorbis_func_floor; + + typedef struct{ + int order; + long rate; + long barkmap; + + int ampbits; + int ampdB; + + int numbooks; /* <= 16 */ + int books[16]; + + float lessthan; /* encode-only config setting hacks for libvorbis */ + float greaterthan; /* encode-only config setting hacks for libvorbis */ + + } vorbis_info_floor0; + + + #define VIF_POSIT 63 + #define VIF_CLASS 16 + #define VIF_PARTS 31 + typedef struct{ + int partitions; /* 0 to 31 */ + int partitionclass[VIF_PARTS]; /* 0 to 15 */ + + int class_dim[VIF_CLASS]; /* 1 to 8 */ + int class_subs[VIF_CLASS]; /* 0,1,2,3 (bits: 1<(y)?(y):(x)) + #endif + + #ifndef max + # define max(x,y) ((x)<(y)?(y):(x)) + #endif + + #if defined(__i386__) && defined(__GNUC__) && !defined(__BEOS__) + # define VORBIS_FPU_CONTROL + /* both GCC and MSVC are kinda stupid about rounding/casting to int. + Because of encapsulation constraints (GCC can't see inside the asm + block and so we end up doing stupid things like a store/load that + is collectively a noop), we do it this way */ + + /* we must set up the fpu before this works!! */ + + typedef ogg_int16_t vorbis_fpu_control; + + static inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ + ogg_int16_t ret; + ogg_int16_t temp; + __asm__ __volatile__("fnstcw %0\n\t" + "movw %0,%%dx\n\t" + "orw $62463,%%dx\n\t" + "movw %%dx,%1\n\t" + "fldcw %1\n\t":"=m"(ret):"m"(temp): "dx"); + *fpu=ret; + } + + static inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ + __asm__ __volatile__("fldcw %0":: "m"(fpu)); + } + + /* assumes the FPU is in round mode! */ + static inline int vorbis_ftoi(double f){ /* yes, double! Otherwise, + we get extra fst/fld to + truncate precision */ + int i; + __asm__("fistl %0": "=m"(i) : "t"(f)); + return(i); + } + #endif + + + #if defined(_WIN32) && !defined(__GNUC__) && !defined(__BORLANDC__) + # define VORBIS_FPU_CONTROL + + typedef ogg_int16_t vorbis_fpu_control; + + static __inline int vorbis_ftoi(double f){ + int i; + __asm{ + fld f + fistp i + } + return i; + } + + static __inline void vorbis_fpu_setround(vorbis_fpu_control *fpu){ + } + + static __inline void vorbis_fpu_restore(vorbis_fpu_control fpu){ + } + + #endif + + + #ifndef VORBIS_FPU_CONTROL + + typedef int vorbis_fpu_control; + + static int vorbis_ftoi(double f){ + return (int)(f+.5); + } + + /* We don't have special code for this compiler/arch, so do it the slow way */ + # define vorbis_fpu_setround(vorbis_fpu_control) {} + # define vorbis_fpu_restore(vorbis_fpu_control) {} + + #endif + + /* encode side bitrate tracking */ + typedef struct bitrate_manager_state { + ogg_uint32_t *queue_binned; + ogg_uint32_t *queue_actual; + int queue_size; + + int queue_head; + int queue_bins; + + long *avg_binacc; + int avg_center; + int avg_tail; + ogg_uint32_t avg_centeracc; + ogg_uint32_t avg_sampleacc; + ogg_uint32_t avg_sampledesired; + ogg_uint32_t avg_centerdesired; + + long *minmax_binstack; + long *minmax_posstack; + long *minmax_limitstack; + long minmax_stackptr; + + long minmax_acctotal; + int minmax_tail; + ogg_uint32_t minmax_sampleacc; + ogg_uint32_t minmax_sampledesired; + + int next_to_flush; + int last_to_flush; + + double avgfloat; + + /* unfortunately, we need to hold queued packet data somewhere */ + oggpack_buffer *packetbuffers; + ogg_packet *packets; + + } bitrate_manager_state; + + typedef struct bitrate_manager_info{ + /* detailed bitrate management setup */ + double queue_avg_time; + double queue_avg_center; + double queue_minmax_time; + double queue_hardmin; + double queue_hardmax; + double queue_avgmin; + double queue_avgmax; + + double avgfloat_downslew_max; + double avgfloat_upslew_max; + + } bitrate_manager_info; + + extern void vorbis_bitrate_init(vorbis_info *vi,bitrate_manager_state *bs); + extern void vorbis_bitrate_clear(bitrate_manager_state *bs); + extern int vorbis_bitrate_managed(vorbis_block *vb); + extern int vorbis_bitrate_addblock(vorbis_block *vb); + extern int vorbis_bitrate_flushpacket(vorbis_dsp_state *vd, ogg_packet *op); + + typedef struct private_state { + /* local lookup storage */ + envelope_lookup *ve; /* envelope lookup */ + int window[2]; + vorbis_look_transform **transform[2]; /* block, type */ + drft_lookup fft_look[2]; + + int modebits; + vorbis_look_floor **flr; + vorbis_look_residue **residue; + vorbis_look_psy *psy; + vorbis_look_psy_global *psy_g_look; + + /* local storage, only used on the encoding side. This way the + application does not need to worry about freeing some packets' + memory and not others'; packet storage is always tracked. + Cleared next call to a _dsp_ function */ + unsigned char *header; + unsigned char *header1; + unsigned char *header2; + + bitrate_manager_state bms; + + ogg_int64_t sample_count; + } private_state; + + /* codec_setup_info contains all the setup information specific to the + specific compression/decompression mode in progress (eg, + psychoacoustic settings, channel setup, options, codebook + etc). + *********************************************************************/ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: highlevel encoder setup struct seperated out for vorbisenc clarity + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + typedef struct highlevel_byblocktype { + double tone_mask_setting; + double tone_peaklimit_setting; + double noise_bias_setting; + double noise_compand_setting; + } highlevel_byblocktype; + + typedef struct highlevel_encode_setup { + void *setup; + int set_in_stone; + + double base_setting; + double long_setting; + double short_setting; + double impulse_noisetune; + + int managed; + long bitrate_min; + long bitrate_av_lo; + long bitrate_av_hi; + long bitrate_max; + double bitrate_limit_window; + double bitrate_av_window; + double bitrate_av_window_center; + + int impulse_block_p; + int noise_normalize_p; + + double stereo_point_setting; + double lowpass_kHz; + + double ath_floating_dB; + double ath_absolute_dB; + + double amplitude_track_dBpersec; + double trigger_setting; + + highlevel_byblocktype block[4]; /* padding, impulse, transition, long */ + + } highlevel_encode_setup; + + typedef struct codec_setup_info { + + /* Vorbis supports only short and long blocks, but allows the + encoder to choose the sizes */ + + long blocksizes[2]; + + /* modes are the primary means of supporting on-the-fly different + blocksizes, different channel mappings (LR or M/A), + different residue backends, etc. Each mode consists of a + blocksize flag and a mapping (along with the mapping setup */ + + int modes; + int maps; + int floors; + int residues; + int books; + int psys; /* encode only */ + + vorbis_info_mode *mode_param[64]; + int map_type[64]; + vorbis_info_mapping *map_param[64]; + int floor_type[64]; + vorbis_info_floor *floor_param[64]; + int residue_type[64]; + vorbis_info_residue *residue_param[64]; + static_codebook *book_param[256]; + codebook *fullbooks; + + vorbis_info_psy *psy_param[4]; /* encode only */ + vorbis_info_psy_global psy_g_param; + + bitrate_manager_info bi; + highlevel_encode_setup hi; /* used only by vorbisenc.c. It's a + highly redundant structure, but + improves clarity of program flow. */ + int halfrate_flag; /* painless downsample for decode */ + } codec_setup_info; + + extern vorbis_look_psy_global *_vp_global_look(vorbis_info *vi); + extern void _vp_global_free(vorbis_look_psy_global *look); + + /* careful with this; it's using static array sizing to make managing + all the modes a little less annoying. If we use a residue backend + with > 12 partition types, or a different division of iteration, + this needs to be updated. */ + typedef struct { + static_codebook *books[12][3]; + } static_bookblock; + + typedef struct { + int res_type; + int limit_type; /* 0 lowpass limited, 1 point stereo limited */ + vorbis_info_residue0 *res; + static_codebook *book_aux; + static_codebook *book_aux_managed; + static_bookblock *books_base; + static_bookblock *books_base_managed; + } vorbis_residue_template; + + typedef struct { + vorbis_info_mapping0 *map; + vorbis_residue_template *res; + } vorbis_mapping_template; + + typedef struct vp_adjblock{ + int block[P_BANDS]; + } vp_adjblock; + + typedef struct { + int data[NOISE_COMPAND_LEVELS]; + } compandblock; + + /* high level configuration information for setting things up + step-by-step with the detailed vorbis_encode_ctl interface. + There's a fair amount of redundancy such that interactive setup + does not directly deal with any vorbis_info or codec_setup_info + initialization; it's all stored (until full init) in this highlevel + setup, then flushed out to the real codec setup structs later. */ + + typedef struct { + int att[P_NOISECURVES]; + float boost; + float decay; + } att3; + typedef struct { int data[P_NOISECURVES]; } adj3; + + typedef struct { + int pre[PACKETBLOBS]; + int post[PACKETBLOBS]; + float kHz[PACKETBLOBS]; + float lowpasskHz[PACKETBLOBS]; + } adj_stereo; + + typedef struct { + int lo; + int hi; + int fixed; + } noiseguard; + typedef struct { + int data[P_NOISECURVES][17]; + } noise3; + + typedef struct { + int mappings; + double *rate_mapping; + double *quality_mapping; + int coupling_restriction; + long samplerate_min_restriction; + long samplerate_max_restriction; + + + int *blocksize_short; + int *blocksize_long; + + att3 *psy_tone_masteratt; + int *psy_tone_0dB; + int *psy_tone_dBsuppress; + + vp_adjblock *psy_tone_adj_impulse; + vp_adjblock *psy_tone_adj_long; + vp_adjblock *psy_tone_adj_other; + + noiseguard *psy_noiseguards; + noise3 *psy_noise_bias_impulse; + noise3 *psy_noise_bias_padding; + noise3 *psy_noise_bias_trans; + noise3 *psy_noise_bias_long; + int *psy_noise_dBsuppress; + + compandblock *psy_noise_compand; + double *psy_noise_compand_short_mapping; + double *psy_noise_compand_long_mapping; + + int *psy_noise_normal_start[2]; + int *psy_noise_normal_partition[2]; + double *psy_noise_normal_thresh; + + int *psy_ath_float; + int *psy_ath_abs; + + double *psy_lowpass; + + vorbis_info_psy_global *global_params; + double *global_mapping; + adj_stereo *stereo_modes; + + static_codebook ***floor_books; + vorbis_info_floor1 *floor_params; + int *floor_short_mapping; + int *floor_long_mapping; + + vorbis_mapping_template *maps; + } ve_setup_data_template; + + /* a few static coder conventions */ + static vorbis_info_mode _mode_template[2]={ + {0,0,0,0}, + {1,0,0,1} + }; + + static vorbis_info_mapping0 _map_nominal[2]={ + {1, {0,0}, {0}, {0}, 1,{0},{1}}, + {1, {0,0}, {1}, {1}, 1,{0},{1}} + }; + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel settings for 44.1/48kHz + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: key floor settings + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: static codebooks autogenerated by huff/huffbuld + last modified: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + static long _huff_lengthlist_line_1024x27_0sub0[] = { + 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 7, 5, 7, 5, 7, 5, 8, 5, 8, 6, + 8, 6, 9, 6, 9, 6, 9, 6,10, 6,10, 6,11, 6,11, 6, + 11, 6,12, 6,12, 7,12, 7,12, 7,12, 7,12, 7,12, 7, + 12, 7,12, 7,12, 7,12, 7,12, 8,12, 8,11, 8,11, 8, + 12, 9,11, 9, 9,10,11, 9,12, 9,12,12,14,13,13,14, + 13,13,13,12,14,16,20,20,21,14,14,15,21,21,21,20, + 21,21,21,21,21,21,21,21,21,21,20,20,20,20,20,20, + }; + + static static_codebook _huff_book_line_1024x27_0sub0 = { + 1, 128, + _huff_lengthlist_line_1024x27_0sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_1sub0[] = { + 2, 5, 5, 4, 5, 4, 5, 4, 5, 4, 6, 4, 6, 5, 6, 5, + 7, 5, 7, 6, 8, 6, 8, 6, 8, 6, 9, 6,10, 6,10, 6, + }; + + static static_codebook _huff_book_line_1024x27_1sub0 = { + 1, 32, + _huff_lengthlist_line_1024x27_1sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 5,10, 4,10, 4, 9, 4, 9, 3, 9, 4, 9, 4, 9, 4, + 9, 4, 9, 4, 9, 4, 8, 4, 8, 4, 8, 5, 9, 5, 9, 6, + 8, 6, 9, 7,10, 8,10, 9,10,10,10,12,11,13,12,13, + 13,15,13,14,13,14,12,15,13,15,14,15,13,16,14,16, + 14,15,14,14,14,16,15,18,15,18,16,18,18,18,18,18, + 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,17, + }; + + static static_codebook _huff_book_line_1024x27_1sub1 = { + 1, 128, + _huff_lengthlist_line_1024x27_1sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_2sub0[] = { + 1, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 6, 7, 6, 7, 7, 8, 8, 9, 8, 9, 9, 9, 9,10,10, + }; + + static static_codebook _huff_book_line_1024x27_2sub0 = { + 1, 32, + _huff_lengthlist_line_1024x27_2sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_2sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 3, 3, 4, 3, 4, 4, 5, 4, 5, 5, 5, 5, 6, 5, 6, 6, + 7, 6, 7, 7, 7, 7, 7, 7, 8, 9, 8, 9, 8,10, 8,11, + 8,12, 9,13, 9,14, 9,14, 8,12, 8,14, 9,14, 8,12, + 8,11, 8,11, 8,11, 9,11,10,11,10,12,10,12,11,12, + 12,12,12,12,11,12,11,13,11,13,12,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13, + }; + + static static_codebook _huff_book_line_1024x27_2sub1 = { + 1, 128, + _huff_lengthlist_line_1024x27_2sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_3sub1[] = { + 0, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 4, 4, 5, 4, + 5, 5, + }; + + static static_codebook _huff_book_line_1024x27_3sub1 = { + 1, 18, + _huff_lengthlist_line_1024x27_3sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 4, 4, 4, 5, 4, 6, 5, 6, 5, 7, + 5, 9, 5,10, 6,11, 6,12, 7,13, 8,15, 8,15, 9,15, + 9,15, + }; + + static static_codebook _huff_book_line_1024x27_3sub2 = { + 1, 50, + _huff_lengthlist_line_1024x27_3sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 9, 2, 9, 2, 9, 4, 9, 6, 9, 7, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + }; + + static static_codebook _huff_book_line_1024x27_3sub3 = { + 1, 128, + _huff_lengthlist_line_1024x27_3sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_4sub1[] = { + 0, 4, 5, 4, 5, 4, 6, 3, 6, 3, 5, 3, 5, 3, 6, 4, + 6, 4, + }; + + static static_codebook _huff_book_line_1024x27_4sub1 = { + 1, 18, + _huff_lengthlist_line_1024x27_4sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_4sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 2, 4, 2, 5, 3, 5, 4, 6, 6, 6, 6, 7, 7, + 7, 8, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9,10,10,11, + 10,11, + }; + + static static_codebook _huff_book_line_1024x27_4sub2 = { + 1, 50, + _huff_lengthlist_line_1024x27_4sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_4sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 6, 4, 6, 4, 5, 5, 7, 4, 8, 5, 9, + 4, 9, 5, 9, 5, 9, 6, 9, 5, 9, 7, 9, 7, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + }; + + static static_codebook _huff_book_line_1024x27_4sub3 = { + 1, 128, + _huff_lengthlist_line_1024x27_4sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_class1[] = { + 2, 9, 8,14, 7,13,11,14, 1, 5, 3, 7, 4,10, 7,12, + }; + + static static_codebook _huff_book_line_1024x27_class1 = { + 1, 16, + _huff_lengthlist_line_1024x27_class1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_class2[] = { + 1, 3, 2, 5, 4, 7, 6, 7, + }; + + static static_codebook _huff_book_line_1024x27_class2 = { + 1, 8, + _huff_lengthlist_line_1024x27_class2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_class3[] = { + 1, 5, 6,19, 5, 8,10,19, 9,10,15,19,19,19,19,19, + 4, 7, 9,19, 6, 7,10,19,11,11,15,19,19,19,19,19, + 8,11,13,19, 8,11,14,19,13,13,17,19,19,19,19,19, + 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, + 3, 7, 9,19, 6, 8,11,19,11,11,15,19,19,19,19,19, + 5, 7,11,19, 6, 7,11,19,11,10,14,19,19,19,19,19, + 8,11,15,19, 8,10,14,19,13,13,16,19,19,19,19,19, + 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, + 6, 9,11,19, 8,10,12,19,15,14,17,19,19,19,19,19, + 5, 8,11,19, 7, 9,12,19,14,11,16,19,19,19,19,19, + 9,10,18,19, 9,10,15,19,14,16,19,19,19,19,19,19, + 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,19, + 16,17,19,19,16,17,17,19,19,19,19,19,19,19,19,19, + 12,14,16,19,12,12,16,19,19,19,19,19,19,19,19,19, + 18,18,19,19,17,16,19,19,19,19,19,19,19,19,19,19, + 19,19,19,19,19,19,19,19,19,19,19,19,19,19,19,18, + }; + + static static_codebook _huff_book_line_1024x27_class3 = { + 1, 256, + _huff_lengthlist_line_1024x27_class3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_1024x27_class4[] = { + 1, 4, 8,12, 4, 6, 8,21, 9, 8,10,21,20,16,18,20, + 2, 6, 8,20, 7, 6, 9,19,11, 9,10,20,17,15,16,20, + 5, 8,11,19, 8, 8,10,15,12,10,12,15,20,20,15,20, + 17,20,20,20,15,20,20,19,20,20,16,19,20,20,20,20, + }; + + static static_codebook _huff_book_line_1024x27_class4 = { + 1, 64, + _huff_lengthlist_line_1024x27_class4, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_0sub0[] = { + 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 6, 5, 6, 6, 6, 6, 6, 6, 6, 6, + 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, 7, 6, + 8, 7, 8, 7, 8, 7, 8, 7, 9, 7, 9, 7, 9, 8,10, 8, + 10, 8,10, 8,10, 8,10, 9,11, 9,11, 9,10, 9,10,10, + 11,10,11,11,11,11,12,12,13,14,13,14,16,16,16,16, + 16,16,15,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,15,15,15, + }; + + static static_codebook _huff_book_line_128x11_0sub0 = { + 1, 128, + _huff_lengthlist_line_128x11_0sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_1sub0[] = { + 2, 5, 5, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 6, 5, 6, 5, 6, 5, 7, 6, 7, 6, 7, 6, 8, 6, 8, 6, + }; + + static static_codebook _huff_book_line_128x11_1sub0 = { + 1, 32, + _huff_lengthlist_line_128x11_1sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 6, 3, 6, 3, 7, 3, 7, 4, 8, 4, 8, 4, 8, 4, 9, 4, + 10, 5, 9, 5,10, 5,10, 5,10, 5,12, 6,12, 6,10, 6, + 10, 7,10, 8,10, 8,10, 9,11, 9,12,11,10,11,11,13, + 12,12,12,13,10,13,10,13,10,13,10,13,11,13,10,13, + 10,13,10,13,10,13,10,13,11,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + }; + + static static_codebook _huff_book_line_128x11_1sub1 = { + 1, 128, + _huff_lengthlist_line_128x11_1sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_2sub1[] = { + 0, 4, 5, 4, 5, 4, 5, 3, 4, 3, 4, 4, 4, 4, 4, 5, + 5, 5, + }; + + static static_codebook _huff_book_line_128x11_2sub1 = { + 1, 18, + _huff_lengthlist_line_128x11_2sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_2sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 3, 4, 3, 5, 4, 5, 5, 6, 5, 6, 6, 6, + 6, 8, 6,10, 7,10, 8,10, 8,10,10,10,10,10,10,10, + 10,10, + }; + + static static_codebook _huff_book_line_128x11_2sub2 = { + 1, 50, + _huff_lengthlist_line_128x11_2sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_2sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + }; + + static static_codebook _huff_book_line_128x11_2sub3 = { + 1, 128, + _huff_lengthlist_line_128x11_2sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_3sub1[] = { + 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 4, + 5, 4, + }; + + static static_codebook _huff_book_line_128x11_3sub1 = { + 1, 18, + _huff_lengthlist_line_128x11_3sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 3, 5, 3, 6, 4, 7, 4, 7, 4, 7, 4, 8, 4, + 8, 4, 9, 4, 9, 4, 9, 5,10, 5,11, 5,12, 6,13, 6, + 13, 7, + }; + + static static_codebook _huff_book_line_128x11_3sub2 = { + 1, 50, + _huff_lengthlist_line_128x11_3sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 2, 6, 2, 7, 3, 8, 4, 7, 6, 9, 7, 9, 7, + 9, 9, 9, 8, 9, 8, 9, 9, 9, 9, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + }; + + static static_codebook _huff_book_line_128x11_3sub3 = { + 1, 128, + _huff_lengthlist_line_128x11_3sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_class1[] = { + 1, 6, 3, 7, 2, 5, 4, 7, + }; + + static static_codebook _huff_book_line_128x11_class1 = { + 1, 8, + _huff_lengthlist_line_128x11_class1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_class2[] = { + 1, 5,11,14, 4,11,13,14,10,14,13,14,14,14,13,13, + 2, 6,11,13, 5,11,12,13,11,12,13,13,13,13,13,13, + 4, 8,12,13, 5, 9,11,13,12,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + }; + + static static_codebook _huff_book_line_128x11_class2 = { + 1, 64, + _huff_lengthlist_line_128x11_class2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x11_class3[] = { + 6, 7,11,16, 6, 7,10,16,11, 9,13,15,15,15,15,15, + 4, 4, 7,14, 4, 4, 6,14, 8, 6, 8,15,15,15,15,15, + 4, 4, 6,15, 3, 2, 4,13, 6, 5, 6,14,15,12,11,14, + 11,11,13,15, 9, 8,10,15,11,10,11,15,15,15,15,15, + }; + + static static_codebook _huff_book_line_128x11_class3 = { + 1, 64, + _huff_lengthlist_line_128x11_class3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_0sub0[] = { + 5, 5, 5, 5, 5, 5, 5, 5, 6, 5, 6, 5, 6, 5, 6, 5, + 6, 5, 6, 5, 6, 5, 6, 5, 7, 5, 7, 5, 7, 6, 7, 6, + 7, 6, 8, 6, 8, 6, 8, 6, 8, 6, 8, 6, 8, 7, 9, 7, + 9, 7, 9, 7, 9, 7, 9, 7, 9, 7,10, 7,10, 8,10, 8, + 11, 8,11, 8,11, 8,12, 8,12, 8,12, 8,12, 9,12, 9, + 12, 9,12, 9,13, 9,13,10,13,10,13,11,14,12,14,13, + 14,14,16,15,17,17,19,18,19,19,19,19,19,19,19,19, + 19,19,19,19,19,19,19,19,19,19,19,18,18,18,18,18, + }; + + static static_codebook _huff_book_line_128x17_0sub0 = { + 1, 128, + _huff_lengthlist_line_128x17_0sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_1sub0[] = { + 2, 5, 5, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 7, 6, 7, 6, 8, 6, 8, 7, 9, 7, 9, 8, + }; + + static static_codebook _huff_book_line_128x17_1sub0 = { + 1, 32, + _huff_lengthlist_line_128x17_1sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 2, 5, 3, 5, 3, 6, 4, 6, 4, 7, 4, 8, 5, 8, 5, + 8, 6, 9, 6, 9, 7, 9, 8,10, 8,10, 9,10,10,10,10, + 10,12,10,14,11,15,12,15,11,15,11,15,11,14,11,15, + 11,14,11,13,10,12,10,14,10,14,11,13,10,12,11,15, + 12,15,13,15,12,13,14,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,14,14,14, + }; + + static static_codebook _huff_book_line_128x17_1sub1 = { + 1, 128, + _huff_lengthlist_line_128x17_1sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_2sub1[] = { + 0, 4, 5, 4, 7, 3, 8, 3, 9, 3,10, 2,12, 3,12, 4, + 11, 6, + }; + + static static_codebook _huff_book_line_128x17_2sub1 = { + 1, 18, + _huff_lengthlist_line_128x17_2sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_2sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 8, 2, 9, 3, 9, 7, 9, 7, 9, 7, 8, 7, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, + }; + + static static_codebook _huff_book_line_128x17_2sub2 = { + 1, 50, + _huff_lengthlist_line_128x17_2sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_2sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + }; + + static static_codebook _huff_book_line_128x17_2sub3 = { + 1, 128, + _huff_lengthlist_line_128x17_2sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_3sub1[] = { + 0, 4, 4, 4, 5, 4, 5, 3, 5, 3, 5, 3, 5, 4, 6, 4, + 6, 4, + }; + + static static_codebook _huff_book_line_128x17_3sub1 = { + 1, 18, + _huff_lengthlist_line_128x17_3sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 3, 6, 3, 6, 3, 7, 4, 8, 4, 8, 4, 9, 4, + 9, 4,10, 4,10, 5,11, 5,11, 5,12, 5,12, 6,12, 6, + 12, 7, + }; + + static static_codebook _huff_book_line_128x17_3sub2 = { + 1, 50, + _huff_lengthlist_line_128x17_3sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 7, 1, 7, 3, 6, 3, 6, 4, 6, 5, 6, 8, 7,10, + 7,11, 7,11, 8,11, 9,11, 7,11, 8,11, 8,11,10,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + }; + + static static_codebook _huff_book_line_128x17_3sub3 = { + 1, 128, + _huff_lengthlist_line_128x17_3sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_class1[] = { + 1, 3, 4, 7, 2, 6, 5, 7, + }; + + static static_codebook _huff_book_line_128x17_class1 = { + 1, 8, + _huff_lengthlist_line_128x17_class1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_class2[] = { + 1, 2, 7,14, 4, 9,13,14, 8,14,14,14,14,14,14,14, + 3, 5,10,14, 8,14,14,14,11,14,14,14,14,14,14,14, + 7,10,14,14,12,14,14,14,14,14,14,14,14,14,14,14, + 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,13, + }; + + static static_codebook _huff_book_line_128x17_class2 = { + 1, 64, + _huff_lengthlist_line_128x17_class2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x17_class3[] = { + 2, 6,11,19, 5, 9,12,19,10,11,13,19,19,19,19,19, + 2, 5, 8,19, 4, 6, 8,19, 8, 8, 9,19,19,16,19,19, + 3, 6, 8,19, 3, 5, 7,18, 8, 8, 9,16,16,11,16,19, + 14,14,14,19,10,10,11,19,16,12,14,19,19,19,19,19, + }; + + static static_codebook _huff_book_line_128x17_class3 = { + 1, 64, + _huff_lengthlist_line_128x17_class3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x4_0sub0[] = { + 2, 2, 2, 2, + }; + + static static_codebook _huff_book_line_128x4_0sub0 = { + 1, 4, + _huff_lengthlist_line_128x4_0sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x4_0sub1[] = { + 0, 0, 0, 0, 3, 2, 3, 2, 3, 3, + }; + + static static_codebook _huff_book_line_128x4_0sub1 = { + 1, 10, + _huff_lengthlist_line_128x4_0sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x4_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 4, 4, 4, 4, + 4, 3, 4, 4, 5, 3, 6, 4, 6, + }; + + static static_codebook _huff_book_line_128x4_0sub2 = { + 1, 25, + _huff_lengthlist_line_128x4_0sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x4_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 5, 2, 6, 3, 6, 3, + 7, 4, 7, 5, 7, 5, 7, 6, 8, 8, 9,10,10,16,10,16, + 10,14,10,14,11,15,15,15,15,15,15,15,15,15,15,15, + }; + + static static_codebook _huff_book_line_128x4_0sub3 = { + 1, 64, + _huff_lengthlist_line_128x4_0sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x4_class0[] = { + 8, 8, 8,14, 7, 7, 8,13, 7, 6, 7,11,11,11,10,13, + 9, 9,10,16, 8, 8, 9,12, 7, 7, 7,11,11,11,10,12, + 11,11,11,14,10,10,10,14, 9, 8, 9,12,13,14,12,14, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 8, 7, 8,11, 7, 7, 7,11, 6, 6, 6,10,10,10,10,14, + 8, 8, 8,12, 7, 7, 8,11, 6, 7, 7,10,10,10,10,13, + 10,10,10,12,10, 9, 9,12, 9, 9, 9,12,12,13,12,14, + 16,16,16,16,16,14,16,16,14,14,16,16,16,16,16,16, + 7, 6, 5, 7, 6, 6, 5, 6, 6, 5, 5, 5, 9,10, 9,10, + 8, 7, 6, 7, 7, 6, 5, 6, 6, 6, 5, 6,10,10, 9, 9, + 10, 9, 7, 8, 9, 8, 7, 7, 8, 7, 6, 7,11,11,10, 9, + 16,13,14,16,14,14,13,15,16,14,12,13,16,16,14,16, + 9, 8, 7, 8, 8, 8, 7, 8, 8, 7, 6, 7,10,10, 9,12, + 9, 9, 8, 8, 9, 8, 7, 8, 8, 8, 6, 7,10,10, 9,12, + 11,10, 9,10,10, 9, 7, 9, 9, 8, 6, 9,12,11,10,13, + 12,16,16,16,12,13,12,16,15,12,11,14,16,16,16,16, + }; + + static static_codebook _huff_book_line_128x4_class0 = { + 1, 256, + _huff_lengthlist_line_128x4_class0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_0sub1[] = { + 0, 3, 3, 3, 3, 3, 3, 3, 3, + }; + + static static_codebook _huff_book_line_128x7_0sub1 = { + 1, 9, + _huff_lengthlist_line_128x7_0sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 4, 3, 4, 4, 4, + 5, 4, 5, 4, 5, 4, 6, 4, 6, + }; + + static static_codebook _huff_book_line_128x7_0sub2 = { + 1, 25, + _huff_lengthlist_line_128x7_0sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 3, 5, 3, 6, 4, + 6, 4, 6, 4, 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 5, 5, + 6, 7, 8,10,12,12,12,12,12,12,12,12,12,12,12,12, + }; + + static static_codebook _huff_book_line_128x7_0sub3 = { + 1, 64, + _huff_lengthlist_line_128x7_0sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_1sub1[] = { + 0, 3, 3, 3, 3, 2, 4, 3, 4, + }; + + static static_codebook _huff_book_line_128x7_1sub1 = { + 1, 9, + _huff_lengthlist_line_128x7_1sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_1sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 3, 6, 3, 7, 3, + 8, 3, 9, 3,10, 3,11, 4,11, + }; + + static static_codebook _huff_book_line_128x7_1sub2 = { + 1, 25, + _huff_lengthlist_line_128x7_1sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_1sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,12, 2, 9, 3,10, 4, + 12, 5,12, 6,12,10,12,11,12,12,12,12,12,12,12,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + }; + + static static_codebook _huff_book_line_128x7_1sub3 = { + 1, 64, + _huff_lengthlist_line_128x7_1sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_class0[] = { + 10, 7, 8,14,10, 7, 7,12,11, 8, 8,13,16,16,16,16, + 8, 5, 5,10, 7, 4, 4, 8, 8, 5, 5, 9,16,16,16,16, + 7, 4, 5, 7, 6, 3, 3, 6, 8, 5, 5, 7,16,14,13,16, + 9, 7, 7,10, 7, 4, 4, 7, 9, 6, 5, 6,15,13,11,14, + }; + + static static_codebook _huff_book_line_128x7_class0 = { + 1, 64, + _huff_lengthlist_line_128x7_class0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_128x7_class1[] = { + 8,12,16,16,10,14,16,16,12,15,16,16,16,16,16,16, + 7,11,15,16, 7,11,16,16,10,12,16,16,16,16,16,16, + 9,15,16,16, 9,12,16,16,11,15,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 6,10,13,16, 7,10,15,16, 9,11,16,16,16,16,16,16, + 4, 8,13,16, 5, 8,15,16, 7, 9,15,16,16,16,16,16, + 6,12,16,16, 6,10,15,16, 9,10,14,16,16,16,16,16, + 14,16,16,16,12,14,16,16,15,16,16,16,16,16,16,16, + 4, 9,11,16, 5, 9,13,16, 7, 9,15,16,16,16,16,16, + 2, 7,11,16, 3, 6,11,16, 5, 7,12,16,16,16,16,16, + 4, 9,14,16, 4, 7,13,16, 6, 8,13,16,16,16,16,16, + 11,14,16,16,10,16,14,16,11,16,16,16,16,16,16,16, + 7,13,16,16, 9,13,15,16,11,13,16,16,16,16,16,16, + 5,10,14,16, 6,10,15,16, 9,10,16,16,16,16,16,16, + 7,13,16,16, 6,10,16,16, 9,12,16,16,16,16,16,16, + 11,16,16,16,10,16,16,16,13,16,16,16,16,16,16,16, + }; + + static static_codebook _huff_book_line_128x7_class1 = { + 1, 256, + _huff_lengthlist_line_128x7_class1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x4_0sub0[] = { + 1, 3, 2, 3, + }; + + static static_codebook _huff_book_line_256x4_0sub0 = { + 1, 4, + _huff_lengthlist_line_256x4_0sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x4_0sub1[] = { + 0, 0, 0, 0, 2, 2, 3, 3, 3, 3, + }; + + static static_codebook _huff_book_line_256x4_0sub1 = { + 1, 10, + _huff_lengthlist_line_256x4_0sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x4_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 4, 3, 4, + 4, 4, 5, 4, 5, 5, 6, 4, 6, + }; + + static static_codebook _huff_book_line_256x4_0sub2 = { + 1, 25, + _huff_lengthlist_line_256x4_0sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x4_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 4, 3, 4, 3, 4, 4, + 5, 4, 5, 5, 6, 5, 7, 6, 8, 7, 9, 8, 9, 9,10,12, + 15,15,15,15,15,15,15,15,14,14,14,14,14,14,14,14, + }; + + static static_codebook _huff_book_line_256x4_0sub3 = { + 1, 64, + _huff_lengthlist_line_256x4_0sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x4_class0[] = { + 4, 5, 6,11, 5, 5, 6,10, 7, 6, 5, 6,14,13,10,10, + 6, 6, 6,10, 6, 6, 6,10, 7, 7, 7, 9, 9,10, 9,12, + 9, 8, 8,11, 8, 8, 8,10, 8, 8, 9,11, 8, 9, 9,13, + 18,18,18,18,16,17,18,18,12,13,14,18,14,14,10,12, + 5, 5, 6,12, 6, 5, 6,10, 7, 7, 6, 7,13,12, 9,12, + 6, 6, 6,11, 6, 6, 6, 9, 7, 7, 7,10,10,10, 9,12, + 9, 8, 8,12, 8, 8, 7,11, 8, 8, 8,11, 9, 9, 8,10, + 18,18,17,18,18,18,15,18,16,14,12,18,14,12,10,11, + 8, 7, 7,12, 8, 7, 7,10, 8, 7, 6, 6,11,10, 9,10, + 8, 8, 7,11, 8, 7, 7, 9, 8, 8, 7, 9,10,10, 9, 9, + 10, 9, 8,12, 9, 9, 8,11,10, 9, 8, 9, 8, 8, 7, 9, + 18,18,18,18,18,18,18,18,17,16,14,18,13,12,11,13, + 12,12,13,16,11,10,10,16,12,12, 9, 7,15,12,11,11, + 14,14,14,14,12,11,11,18,14,12,10,11,18,13,11,13, + 18,18,18,17,17,16,15,17,18,15,16,18,16,12,11,11, + 18,18,18,18,18,18,18,18,18,18,17,18,18,13,12,15, + }; + + static static_codebook _huff_book_line_256x4_class0 = { + 1, 256, + _huff_lengthlist_line_256x4_class0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_0sub1[] = { + 0, 2, 3, 3, 3, 3, 4, 3, 4, + }; + + static static_codebook _huff_book_line_256x7_0sub1 = { + 1, 9, + _huff_lengthlist_line_256x7_0sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_0sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 4, 3, 4, 3, 5, 3, + 6, 3, 6, 4, 6, 4, 7, 5, 7, + }; + + static static_codebook _huff_book_line_256x7_0sub2 = { + 1, 25, + _huff_lengthlist_line_256x7_0sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_0sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 5, 2, 5, 3, 5, 3, + 6, 3, 6, 4, 7, 6, 7, 8, 7, 9, 8, 9, 9, 9,10, 9, + 11,13,11,13,10,10,13,13,13,13,13,13,12,12,12,12, + }; + + static static_codebook _huff_book_line_256x7_0sub3 = { + 1, 64, + _huff_lengthlist_line_256x7_0sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_1sub1[] = { + 0, 3, 3, 3, 3, 2, 4, 3, 4, + }; + + static static_codebook _huff_book_line_256x7_1sub1 = { + 1, 9, + _huff_lengthlist_line_256x7_1sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_1sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 3, 4, 3, 4, 4, + 5, 4, 6, 5, 6, 7, 6, 8, 8, + }; + + static static_codebook _huff_book_line_256x7_1sub2 = { + 1, 25, + _huff_lengthlist_line_256x7_1sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_1sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 4, 3, 6, 3, 7, + 3, 8, 5, 8, 6, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 7, + }; + + static static_codebook _huff_book_line_256x7_1sub3 = { + 1, 64, + _huff_lengthlist_line_256x7_1sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_class0[] = { + 7, 5, 5, 9, 9, 6, 6, 9,12, 8, 7, 8,11, 8, 9,15, + 6, 3, 3, 7, 7, 4, 3, 6, 9, 6, 5, 6, 8, 6, 8,15, + 8, 5, 5, 9, 8, 5, 4, 6,10, 7, 5, 5,11, 8, 7,15, + 14,15,13,13,13,13, 8,11,15,10, 7, 6,11, 9,10,15, + }; + + static static_codebook _huff_book_line_256x7_class0 = { + 1, 64, + _huff_lengthlist_line_256x7_class0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_256x7_class1[] = { + 5, 6, 8,15, 6, 9,10,15,10,11,12,15,15,15,15,15, + 4, 6, 7,15, 6, 7, 8,15, 9, 8, 9,15,15,15,15,15, + 6, 8, 9,15, 7, 7, 8,15,10, 9,10,15,15,15,15,15, + 15,13,15,15,15,10,11,15,15,13,13,15,15,15,15,15, + 4, 6, 7,15, 6, 8, 9,15,10,10,12,15,15,15,15,15, + 2, 5, 6,15, 5, 6, 7,15, 8, 6, 7,15,15,15,15,15, + 5, 6, 8,15, 5, 6, 7,15, 9, 6, 7,15,15,15,15,15, + 14,12,13,15,12,10,11,15,15,15,15,15,15,15,15,15, + 7, 8, 9,15, 9,10,10,15,15,14,14,15,15,15,15,15, + 5, 6, 7,15, 7, 8, 9,15,12, 9,10,15,15,15,15,15, + 7, 7, 9,15, 7, 7, 8,15,12, 8, 9,15,15,15,15,15, + 13,13,14,15,12,11,12,15,15,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + 13,13,13,15,15,15,15,15,15,15,15,15,15,15,15,15, + 15,12,13,15,15,12,13,15,15,14,15,15,15,15,15,15, + 15,15,15,15,15,15,13,15,15,15,15,15,15,15,15,15, + }; + + static static_codebook _huff_book_line_256x7_class1 = { + 1, 256, + _huff_lengthlist_line_256x7_class1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_0sub0[] = { + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 6, 5, 6, 6, 6, 6, 5, 6, 6, 7, 6, 7, 6, 7, 6, + 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, 8, 7, 9, 7, 9, 7, + 9, 7, 9, 8, 9, 8,10, 8,10, 8,10, 7,10, 6,10, 8, + 10, 8,11, 7,10, 7,11, 8,11,11,12,12,11,11,12,11, + 13,11,13,11,13,12,15,12,13,13,14,14,14,14,14,15, + 15,15,16,14,17,19,19,18,18,18,18,18,18,18,18,18, + 18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18, + }; + + static static_codebook _huff_book_line_512x17_0sub0 = { + 1, 128, + _huff_lengthlist_line_512x17_0sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_1sub0[] = { + 2, 4, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 5, 5, 6, 5, + 6, 5, 6, 6, 7, 6, 7, 6, 8, 7, 8, 7, 8, 7, 8, 7, + }; + + static static_codebook _huff_book_line_512x17_1sub0 = { + 1, 32, + _huff_lengthlist_line_512x17_1sub0, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_1sub1[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 4, 3, 5, 3, 5, 4, 5, 4, 5, 4, 5, 5, 5, 5, 6, 5, + 6, 5, 7, 5, 8, 6, 8, 6, 8, 6, 8, 6, 8, 7, 9, 7, + 9, 7,11, 9,11,11,12,11,14,12,14,16,14,16,13,16, + 14,16,12,15,13,16,14,16,13,14,12,15,13,15,13,13, + 13,15,12,14,14,15,13,15,12,15,15,15,15,15,15,15, + 15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15, + }; + + static static_codebook _huff_book_line_512x17_1sub1 = { + 1, 128, + _huff_lengthlist_line_512x17_1sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_2sub1[] = { + 0, 4, 5, 4, 4, 4, 5, 4, 4, 4, 5, 4, 5, 4, 5, 3, + 5, 3, + }; + + static static_codebook _huff_book_line_512x17_2sub1 = { + 1, 18, + _huff_lengthlist_line_512x17_2sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_2sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 3, 4, 3, 4, 4, 5, 4, 5, 4, 6, 4, 6, 5, + 6, 5, 7, 5, 7, 6, 8, 6, 8, 6, 8, 7, 8, 7, 9, 7, + 9, 8, + }; + + static static_codebook _huff_book_line_512x17_2sub2 = { + 1, 50, + _huff_lengthlist_line_512x17_2sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_2sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 3, 3, 3, 3, 4, 3, 4, 4, 5, 5, 6, 6, 7, 7, + 7, 8, 8,11, 8, 9, 9, 9,10,11,11,11, 9,10,10,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + }; + + static static_codebook _huff_book_line_512x17_2sub3 = { + 1, 128, + _huff_lengthlist_line_512x17_2sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_3sub1[] = { + 0, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 5, 4, 5, + 5, 5, + }; + + static static_codebook _huff_book_line_512x17_3sub1 = { + 1, 18, + _huff_lengthlist_line_512x17_3sub1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_3sub2[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 3, 3, 4, 3, 5, 4, 6, 4, 6, 5, 7, 6, 7, + 6, 8, 6, 8, 7, 9, 8,10, 8,12, 9,13,10,15,10,15, + 11,14, + }; + + static static_codebook _huff_book_line_512x17_3sub2 = { + 1, 50, + _huff_lengthlist_line_512x17_3sub2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_3sub3[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 8, 4, 8, 4, 8, 4, 8, 5, 8, 5, 8, 6, 8, + 4, 8, 4, 8, 5, 8, 5, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + }; + + static static_codebook _huff_book_line_512x17_3sub3 = { + 1, 128, + _huff_lengthlist_line_512x17_3sub3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_class1[] = { + 1, 2, 3, 6, 5, 4, 7, 7, + }; + + static static_codebook _huff_book_line_512x17_class1 = { + 1, 8, + _huff_lengthlist_line_512x17_class1, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_class2[] = { + 3, 3, 3,14, 5, 4, 4,11, 8, 6, 6,10,17,12,11,17, + 6, 5, 5,15, 5, 3, 4,11, 8, 5, 5, 8,16, 9,10,14, + 10, 8, 9,17, 8, 6, 6,13,10, 7, 7,10,16,11,13,14, + 17,17,17,17,17,16,16,16,16,15,16,16,16,16,16,16, + }; + + static static_codebook _huff_book_line_512x17_class2 = { + 1, 64, + _huff_lengthlist_line_512x17_class2, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist_line_512x17_class3[] = { + 2, 4, 6,17, 4, 5, 7,17, 8, 7,10,17,17,17,17,17, + 3, 4, 6,15, 3, 3, 6,15, 7, 6, 9,17,17,17,17,17, + 6, 8,10,17, 6, 6, 8,16, 9, 8,10,17,17,15,16,17, + 17,17,17,17,12,15,15,16,12,15,15,16,16,16,16,16, + }; + + static static_codebook _huff_book_line_512x17_class3 = { + 1, 64, + _huff_lengthlist_line_512x17_class3, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static static_codebook *_floor_128x4_books[]={ + &_huff_book_line_128x4_class0, + &_huff_book_line_128x4_0sub0, + &_huff_book_line_128x4_0sub1, + &_huff_book_line_128x4_0sub2, + &_huff_book_line_128x4_0sub3, + }; + static static_codebook *_floor_256x4_books[]={ + &_huff_book_line_256x4_class0, + &_huff_book_line_256x4_0sub0, + &_huff_book_line_256x4_0sub1, + &_huff_book_line_256x4_0sub2, + &_huff_book_line_256x4_0sub3, + }; + static static_codebook *_floor_128x7_books[]={ + &_huff_book_line_128x7_class0, + &_huff_book_line_128x7_class1, + + &_huff_book_line_128x7_0sub1, + &_huff_book_line_128x7_0sub2, + &_huff_book_line_128x7_0sub3, + &_huff_book_line_128x7_1sub1, + &_huff_book_line_128x7_1sub2, + &_huff_book_line_128x7_1sub3, + }; + static static_codebook *_floor_256x7_books[]={ + &_huff_book_line_256x7_class0, + &_huff_book_line_256x7_class1, + + &_huff_book_line_256x7_0sub1, + &_huff_book_line_256x7_0sub2, + &_huff_book_line_256x7_0sub3, + &_huff_book_line_256x7_1sub1, + &_huff_book_line_256x7_1sub2, + &_huff_book_line_256x7_1sub3, + }; + static static_codebook *_floor_128x11_books[]={ + &_huff_book_line_128x11_class1, + &_huff_book_line_128x11_class2, + &_huff_book_line_128x11_class3, + + &_huff_book_line_128x11_0sub0, + &_huff_book_line_128x11_1sub0, + &_huff_book_line_128x11_1sub1, + &_huff_book_line_128x11_2sub1, + &_huff_book_line_128x11_2sub2, + &_huff_book_line_128x11_2sub3, + &_huff_book_line_128x11_3sub1, + &_huff_book_line_128x11_3sub2, + &_huff_book_line_128x11_3sub3, + }; + static static_codebook *_floor_128x17_books[]={ + &_huff_book_line_128x17_class1, + &_huff_book_line_128x17_class2, + &_huff_book_line_128x17_class3, + + &_huff_book_line_128x17_0sub0, + &_huff_book_line_128x17_1sub0, + &_huff_book_line_128x17_1sub1, + &_huff_book_line_128x17_2sub1, + &_huff_book_line_128x17_2sub2, + &_huff_book_line_128x17_2sub3, + &_huff_book_line_128x17_3sub1, + &_huff_book_line_128x17_3sub2, + &_huff_book_line_128x17_3sub3, + }; + static static_codebook *_floor_512x17_books[]={ + &_huff_book_line_512x17_class1, + &_huff_book_line_512x17_class2, + &_huff_book_line_512x17_class3, + + &_huff_book_line_512x17_0sub0, + &_huff_book_line_512x17_1sub0, + &_huff_book_line_512x17_1sub1, + &_huff_book_line_512x17_2sub1, + &_huff_book_line_512x17_2sub2, + &_huff_book_line_512x17_2sub3, + &_huff_book_line_512x17_3sub1, + &_huff_book_line_512x17_3sub2, + &_huff_book_line_512x17_3sub3, + }; + static static_codebook *_floor_1024x27_books[]={ + &_huff_book_line_1024x27_class1, + &_huff_book_line_1024x27_class2, + &_huff_book_line_1024x27_class3, + &_huff_book_line_1024x27_class4, + + &_huff_book_line_1024x27_0sub0, + &_huff_book_line_1024x27_1sub0, + &_huff_book_line_1024x27_1sub1, + &_huff_book_line_1024x27_2sub0, + &_huff_book_line_1024x27_2sub1, + &_huff_book_line_1024x27_3sub1, + &_huff_book_line_1024x27_3sub2, + &_huff_book_line_1024x27_3sub3, + &_huff_book_line_1024x27_4sub1, + &_huff_book_line_1024x27_4sub2, + &_huff_book_line_1024x27_4sub3, + }; + + static static_codebook **_floor_books[10]={ + _floor_128x4_books, + _floor_256x4_books, + _floor_128x7_books, + _floor_256x7_books, + _floor_128x11_books, + _floor_128x17_books, + _floor_128x17_books, + _floor_1024x27_books, + _floor_1024x27_books, + _floor_512x17_books, + }; + + static vorbis_info_floor1 _floor[10]={ + /* 128 x 4 */ + { + 1,{0},{4},{2},{0}, + {{1,2,3,4}}, + 4,{0,128, 33,8,16,70}, + + 60,30,500, 1.,18., -1 + }, + /* 256 x 4 */ + { + 1,{0},{4},{2},{0}, + {{1,2,3,4}}, + 4,{0,256, 66,16,32,140}, + + 60,30,500, 1.,18., -1 + }, + /* 128 x 7 */ + { + 2,{0,1},{3,4},{2,2},{0,1}, + {{-1,2,3,4},{-1,5,6,7}}, + 4,{0,128, 14,4,58, 2,8,28,90}, + + 60,30,500, 1.,18., -1 + }, + /* 256 x 7 */ + { + 2,{0,1},{3,4},{2,2},{0,1}, + {{-1,2,3,4},{-1,5,6,7}}, + 4,{0,256, 28,8,116, 4,16,56,180}, + + 60,30,500, 1.,18., -1 + }, + + /* 128 x 11 */ + { + 4,{0,1,2,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + + 2,{0,128, 8,33, 4,16,70, 2,6,12, 23,46,90}, + + 60,30,500, 1,18., -1 + }, + + /* 128 x 17 */ + { + 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + 2,{0,128, 12,46, 4,8,16, 23,33,70, 2,6,10, 14,19,28, 39,58,90}, + + 60,30,500, 1,18., -1 + }, + + /* 1024 x 17 */ + { + 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + 2,{0,1024, 93,372, 33,65,130, 186,260,556, + 14,46,79, 111,158,220, 312,464,720}, + + 60,30,500, 1,18., -1 /* lowpass! */ + }, + /* 1024 x 27 */ + { + 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, + {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, + 2,{0,1024, 93,23,372, 6,46,186,750, 14,33,65, 130,260,556, + 3,10,18,28, 39,55,79,111, 158,220,312, 464,650,850}, + + 60,30,500, 3,18., -1 /* lowpass */ + }, + /* 2048 x 27 */ + { + 8,{0,1,2,2,3,3,4,4},{3,4,3,4,3},{0,1,1,2,2},{-1,0,1,2,3}, + {{4},{5,6},{7,8},{-1,9,10,11},{-1,12,13,14}}, + 2,{0,2048, 186,46,744, 12,92,372,1500, 28,66,130, 260,520,1112, + 6,20,36,56, 78,110,158,222, 316,440,624, 928,1300,1700}, + + 60,30,500, 3,18., -1 /* lowpass */ + }, + /* 512 x 17 */ + { + 6,{0,1,1,2,3,3},{2,3,3,3},{0,1,2,2},{-1,0,1,2}, + {{3},{4,5},{-1,6,7,8},{-1,9,10,11}}, + 2,{0,512, 46,186, 16,33,65, 93,130,278, + 7,23,39, 55,79,110, 156,232,360}, + + 60,30,500, 1,18., -1 /* lowpass! */ + }, + + }; + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: toplevel residue templates for 32/44.1/48kHz + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the Xiph.Org Foundation http://www.xiph.org/ * + * * + ******************************************************************** + + function: static codebooks autogenerated by huff/huffbuld + last modified: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + static long _vq_quantlist__16c0_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c0_s_p1_0[] = { + 1, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, + 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, + 0, 0, 0, 9, 9,12, 0, 0, 0, 0, 0, 0,10,12,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, + 0, 0, 0, 0, 9,12,10, 0, 0, 0, 0, 0, 0,10,11,12, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, + 0, 0, 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,12,11, 0, + 0, 0, 0, 0, 0, 9,10,12, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7,10,10, 0, 0, 0, 0, 0, 0,10,11,12, + 0, 0, 0, 0, 0, 0, 9,12, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c0_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__16c0_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p1_0 = { + _vq_quantthresh__16c0_s_p1_0, + _vq_quantmap__16c0_s_p1_0, + 3, + 3 + }; + + static static_codebook _16c0_s_p1_0 = { + 8, 6561, + _vq_lengthlist__16c0_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__16c0_s_p1_0, + NULL, + &_vq_auxt__16c0_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c0_s_p2_0[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c0_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c0_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p2_0 = { + _vq_quantthresh__16c0_s_p2_0, + _vq_quantmap__16c0_s_p2_0, + 5, + 5 + }; + + static static_codebook _16c0_s_p2_0 = { + 4, 625, + _vq_lengthlist__16c0_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c0_s_p2_0, + NULL, + &_vq_auxt__16c0_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c0_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 7, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 6, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c0_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c0_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p3_0 = { + _vq_quantthresh__16c0_s_p3_0, + _vq_quantmap__16c0_s_p3_0, + 5, + 5 + }; + + static static_codebook _16c0_s_p3_0 = { + 4, 625, + _vq_lengthlist__16c0_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c0_s_p3_0, + NULL, + &_vq_auxt__16c0_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__16c0_s_p4_0[] = { + 1, 3, 2, 7, 8, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c0_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__16c0_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p4_0 = { + _vq_quantthresh__16c0_s_p4_0, + _vq_quantmap__16c0_s_p4_0, + 9, + 9 + }; + + static static_codebook _16c0_s_p4_0 = { + 2, 81, + _vq_lengthlist__16c0_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__16c0_s_p4_0, + NULL, + &_vq_auxt__16c0_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__16c0_s_p5_0[] = { + 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 8, 0, 0, 0, 7, 7, + 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, 0, 0, + 8, 9, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, + }; + + static float _vq_quantthresh__16c0_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__16c0_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p5_0 = { + _vq_quantthresh__16c0_s_p5_0, + _vq_quantmap__16c0_s_p5_0, + 9, + 9 + }; + + static static_codebook _16c0_s_p5_0 = { + 2, 81, + _vq_lengthlist__16c0_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__16c0_s_p5_0, + NULL, + &_vq_auxt__16c0_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__16c0_s_p6_0[] = { + 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,11, + 11,11, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, + 11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,12,13, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10,10,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, 0, 0, + 10,10,10,11,11,11,12,12,13,13,13,14, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,13,13,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,13,13,14,15,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,14,14,15, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,14,13,14, + 14, + }; + + static float _vq_quantthresh__16c0_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__16c0_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p6_0 = { + _vq_quantthresh__16c0_s_p6_0, + _vq_quantmap__16c0_s_p6_0, + 17, + 17 + }; + + static static_codebook _16c0_s_p6_0 = { + 2, 289, + _vq_lengthlist__16c0_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__16c0_s_p6_0, + NULL, + &_vq_auxt__16c0_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c0_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,11,10,10,11, + 11,10, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, + 11,11,11,10, 6, 9, 9,11,12,12,11, 9, 9, 6, 9,10, + 11,12,12,11, 9,10, 7,11,11,11,11,11,12,13,12, 6, + 9,10,11,10,10,12,13,13, 6,10, 9,11,10,10,11,12, + 13, + }; + + static float _vq_quantthresh__16c0_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__16c0_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p7_0 = { + _vq_quantthresh__16c0_s_p7_0, + _vq_quantmap__16c0_s_p7_0, + 3, + 3 + }; + + static static_codebook _16c0_s_p7_0 = { + 4, 81, + _vq_lengthlist__16c0_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__16c0_s_p7_0, + NULL, + &_vq_auxt__16c0_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__16c0_s_p7_1[] = { + 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, + 8, 8, 8, 9, 9, 9,10,10,10, 6, 7, 8, 8, 8, 8, 9, + 8,10,10,10, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, 7, + 7, 8, 8, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9, 9, + 9, 9,11,11,11, 8, 8, 9, 9, 9, 9, 9,10,10,11,11, + 9, 9, 9, 9, 9, 9, 9,10,11,11,11,10,11, 9, 9, 9, + 9,10, 9,11,11,11,10,11,10,10, 9, 9,10,10,11,11, + 11,11,11, 9, 9, 9, 9,10,10, + }; + + static float _vq_quantthresh__16c0_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__16c0_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p7_1 = { + _vq_quantthresh__16c0_s_p7_1, + _vq_quantmap__16c0_s_p7_1, + 11, + 11 + }; + + static static_codebook _16c0_s_p7_1 = { + 2, 121, + _vq_lengthlist__16c0_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__16c0_s_p7_1, + NULL, + &_vq_auxt__16c0_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__16c0_s_p8_0[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 6, 8, 8,10,10, 6, 5, 6, + 8, 8, 8, 8, 8, 8, 8, 9,10,10, 7, 6, 6, 8, 8, 8, + 8, 8, 8, 8, 8,10,10, 0, 8, 8, 8, 8, 9, 8, 9, 9, + 9,10,10,10, 0, 9, 8, 8, 8, 9, 9, 8, 8, 9, 9,10, + 10, 0,12,11, 8, 8, 9, 9, 9, 9,10,10,11,10, 0,12, + 13, 8, 8, 9,10, 9, 9,11,11,11,12, 0, 0, 0, 8, 8, + 8, 8,10, 9,12,13,12,14, 0, 0, 0, 8, 8, 8, 9,10, + 10,12,12,13,14, 0, 0, 0,13,13, 9, 9,11,11, 0, 0, + 14, 0, 0, 0, 0,14,14,10,10,12,11,12,14,14,14, 0, + 0, 0, 0, 0,11,11,13,13,14,13,14,14, 0, 0, 0, 0, + 0,12,13,13,12,13,14,14,14, + }; + + static float _vq_quantthresh__16c0_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__16c0_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p8_0 = { + _vq_quantthresh__16c0_s_p8_0, + _vq_quantmap__16c0_s_p8_0, + 13, + 13 + }; + + static static_codebook _16c0_s_p8_0 = { + 2, 169, + _vq_lengthlist__16c0_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__16c0_s_p8_0, + NULL, + &_vq_auxt__16c0_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c0_s_p8_1[] = { + 1, 4, 3, 5, 5, 7, 7, 7, 6, 6, 7, 7, 7, 5, 5, 7, + 7, 7, 6, 6, 7, 7, 7, 6, 6, + }; + + static float _vq_quantthresh__16c0_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c0_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p8_1 = { + _vq_quantthresh__16c0_s_p8_1, + _vq_quantmap__16c0_s_p8_1, + 5, + 5 + }; + + static static_codebook _16c0_s_p8_1 = { + 2, 25, + _vq_lengthlist__16c0_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c0_s_p8_1, + NULL, + &_vq_auxt__16c0_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p9_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c0_s_p9_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + }; + + static float _vq_quantthresh__16c0_s_p9_0[] = { + -157.5, 157.5, + }; + + static long _vq_quantmap__16c0_s_p9_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p9_0 = { + _vq_quantthresh__16c0_s_p9_0, + _vq_quantmap__16c0_s_p9_0, + 3, + 3 + }; + + static static_codebook _16c0_s_p9_0 = { + 4, 81, + _vq_lengthlist__16c0_s_p9_0, + 1, -518803456, 1628680192, 2, 0, + _vq_quantlist__16c0_s_p9_0, + NULL, + &_vq_auxt__16c0_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__16c0_s_p9_1[] = { + 1, 5, 5, 5, 5, 9,11,11,10,10,10,10,10,10,10, 7, + 6, 6, 6, 6,10,10,10,10,10,10,10,10,10,10, 7, 6, + 6, 6, 6,10, 9,10,10,10,10,10,10,10,10,10, 7, 7, + 8, 9,10,10,10,10,10,10,10,10,10,10,10, 8, 7,10, + 10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, + }; + + static float _vq_quantthresh__16c0_s_p9_1[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__16c0_s_p9_1[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p9_1 = { + _vq_quantthresh__16c0_s_p9_1, + _vq_quantmap__16c0_s_p9_1, + 15, + 15 + }; + + static static_codebook _16c0_s_p9_1 = { + 2, 225, + _vq_lengthlist__16c0_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__16c0_s_p9_1, + NULL, + &_vq_auxt__16c0_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c0_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__16c0_s_p9_2[] = { + 1, 5, 5, 7, 8, 8, 7, 9, 9, 9,12,12,11,12,12,10, + 10,11,12,12,12,11,12,12, 8, 9, 8, 7, 9,10,10,11, + 11,10,11,12,10,12,10,12,12,12,11,12,11, 9, 8, 8, + 9,10, 9, 8, 9,10,12,12,11,11,12,11,10,11,12,11, + 12,12, 8, 9, 9, 9,10,11,12,11,12,11,11,11,11,12, + 12,11,11,12,12,11,11, 9, 9, 8, 9, 9,11, 9, 9,10, + 9,11,11,11,11,12,11,11,10,12,12,12, 9,12,11,10, + 11,11,11,11,12,12,12,11,11,11,12,10,12,12,12,10, + 10, 9,10, 9,10,10, 9, 9, 9,10,10,12,10,11,11, 9, + 11,11,10,11,11,11,10,10,10, 9, 9,10,10, 9, 9,10, + 11,11,10,11,10,11,10,11,11,10,11,11,11,10, 9,10, + 10, 9,10, 9, 9,11, 9, 9,11,10,10,11,11,10,10,11, + 10,11, 8, 9,11,11,10, 9,10,11,11,10,11,11,10,10, + 10,11,10, 9,10,10,11, 9,10,10, 9,11,10,10,10,10, + 11,10,11,11, 9,11,10,11,10,10,11,11,10,10,10, 9, + 10,10,11,11,11, 9,10,10,10,10,10,11,10,10,10, 9, + 10,10,11,10,10,10,10,10, 9,10,11,10,10,10,10,11, + 11,11,10,10,10,10,10,11,10,11,10,11,10,10,10, 9, + 11,11,10,10,10,11,11,10,10,10,10,10,10,10,10,11, + 11, 9,10,10,10,11,10,11,10,10,10,11, 9,10,11,10, + 11,10,10, 9,10,10,10,11,10,11,10,10,10,10,10,11, + 11,10,11,11,10,10,11,11,10, 9, 9,10,10,10,10,10, + 9,11, 9,10,10,10,11,11,10,10,10,10,11,11,11,10, + 9, 9,10,10,11,10,10,10,10,10,11,11,11,10,10,10, + 11,11,11, 9,10,10,10,10, 9,10, 9,10,11,10,11,10, + 10,11,11,10,11,11,11,11,11,10,11,10,10,10, 9,11, + 11,10,11,11,11,11,11,11,11,11,11,10,11,10,10,10, + 10,11,10,10,11, 9,10,10,10, + }; + + static float _vq_quantthresh__16c0_s_p9_2[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__16c0_s_p9_2[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__16c0_s_p9_2 = { + _vq_quantthresh__16c0_s_p9_2, + _vq_quantmap__16c0_s_p9_2, + 21, + 21 + }; + + static static_codebook _16c0_s_p9_2 = { + 2, 441, + _vq_lengthlist__16c0_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__16c0_s_p9_2, + NULL, + &_vq_auxt__16c0_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__16c0_s_single[] = { + 3, 4,19, 7, 9, 7, 8,11, 9,12, 4, 1,19, 6, 7, 7, + 8,10,11,13,18,18,18,18,18,18,18,18,18,18, 8, 6, + 18, 8, 9, 9,11,12,14,18, 9, 6,18, 9, 7, 8, 9,11, + 12,18, 7, 6,18, 8, 7, 7, 7, 9,11,17, 8, 8,18, 9, + 7, 6, 6, 8,11,17,10,10,18,12, 9, 8, 7, 9,12,18, + 13,15,18,15,13,11,10,11,15,18,14,18,18,18,18,18, + 16,16,18,18, + }; + + static static_codebook _huff_book__16c0_s_single = { + 2, 100, + _huff_lengthlist__16c0_s_single, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__16c1_s_long[] = { + 2, 5,20, 7,10, 7, 8,10,11,11, 4, 2,20, 5, 8, 6, + 7, 9,10,10,20,20,20,20,19,19,19,19,19,19, 7, 5, + 19, 6,10, 7, 9,11,13,17,11, 8,19,10, 7, 7, 8,10, + 11,15, 7, 5,19, 7, 7, 5, 6, 9,11,16, 7, 6,19, 8, + 7, 6, 6, 7, 9,13, 9, 9,19,11, 9, 8, 6, 7, 8,13, + 12,14,19,16,13,10, 9, 8, 9,13,14,17,19,18,18,17, + 12,11,11,13, + }; + + static static_codebook _huff_book__16c1_s_long = { + 2, 100, + _huff_lengthlist__16c1_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c1_s_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 9,11, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c1_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__16c1_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p1_0 = { + _vq_quantthresh__16c1_s_p1_0, + _vq_quantmap__16c1_s_p1_0, + 3, + 3 + }; + + static static_codebook _16c1_s_p1_0 = { + 8, 6561, + _vq_lengthlist__16c1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__16c1_s_p1_0, + NULL, + &_vq_auxt__16c1_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c1_s_p2_0[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c1_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c1_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p2_0 = { + _vq_quantthresh__16c1_s_p2_0, + _vq_quantmap__16c1_s_p2_0, + 5, + 5 + }; + + static static_codebook _16c1_s_p2_0 = { + 4, 625, + _vq_lengthlist__16c1_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c1_s_p2_0, + NULL, + &_vq_auxt__16c1_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c1_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c1_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c1_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p3_0 = { + _vq_quantthresh__16c1_s_p3_0, + _vq_quantmap__16c1_s_p3_0, + 5, + 5 + }; + + static static_codebook _16c1_s_p3_0 = { + 4, 625, + _vq_lengthlist__16c1_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c1_s_p3_0, + NULL, + &_vq_auxt__16c1_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__16c1_s_p4_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c1_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__16c1_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p4_0 = { + _vq_quantthresh__16c1_s_p4_0, + _vq_quantmap__16c1_s_p4_0, + 9, + 9 + }; + + static static_codebook _16c1_s_p4_0 = { + 2, 81, + _vq_lengthlist__16c1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__16c1_s_p4_0, + NULL, + &_vq_auxt__16c1_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__16c1_s_p5_0[] = { + 1, 3, 3, 5, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 8, 8, + 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, + }; + + static float _vq_quantthresh__16c1_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__16c1_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p5_0 = { + _vq_quantthresh__16c1_s_p5_0, + _vq_quantmap__16c1_s_p5_0, + 9, + 9 + }; + + static static_codebook _16c1_s_p5_0 = { + 2, 81, + _vq_lengthlist__16c1_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__16c1_s_p5_0, + NULL, + &_vq_auxt__16c1_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__16c1_s_p6_0[] = { + 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11,12, + 12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 0, 0, 8, 8, 8, 9,10, 9,10,10,10,10, + 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10,11, + 11,11,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,13,13, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, + 14, + }; + + static float _vq_quantthresh__16c1_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__16c1_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p6_0 = { + _vq_quantthresh__16c1_s_p6_0, + _vq_quantmap__16c1_s_p6_0, + 17, + 17 + }; + + static static_codebook _16c1_s_p6_0 = { + 2, 289, + _vq_lengthlist__16c1_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__16c1_s_p6_0, + NULL, + &_vq_auxt__16c1_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c1_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9,10,10, + 10, 9, 4, 7, 7,10,10,10,11,10,10, 6,10,10,11,11, + 11,11,10,10, 6,10, 9,11,11,11,11,10,10, 6,10,10, + 11,11,11,11,10,10, 7,11,11,11,11,11,12,12,11, 6, + 10,10,11,10,10,11,11,11, 6,10,10,10,11,10,11,11, + 11, + }; + + static float _vq_quantthresh__16c1_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__16c1_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p7_0 = { + _vq_quantthresh__16c1_s_p7_0, + _vq_quantmap__16c1_s_p7_0, + 3, + 3 + }; + + static static_codebook _16c1_s_p7_0 = { + 4, 81, + _vq_lengthlist__16c1_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__16c1_s_p7_0, + NULL, + &_vq_auxt__16c1_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__16c1_s_p7_1[] = { + 2, 3, 3, 5, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, + 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 9, 9,10,10,10,10,10, 8, 8, 8, + 8, 9, 9,10,10,10,10,10, 9, 9, 8, 8, 9, 9,10,10, + 10,10,10, 8, 8, 8, 8, 9, 9, + }; + + static float _vq_quantthresh__16c1_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__16c1_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p7_1 = { + _vq_quantthresh__16c1_s_p7_1, + _vq_quantmap__16c1_s_p7_1, + 11, + 11 + }; + + static static_codebook _16c1_s_p7_1 = { + 2, 121, + _vq_lengthlist__16c1_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__16c1_s_p7_1, + NULL, + &_vq_auxt__16c1_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__16c1_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 6, 5, 5, + 7, 8, 8, 9, 8, 8, 9, 9,10,11, 6, 5, 5, 8, 8, 9, + 9, 8, 8, 9,10,10,11, 0, 8, 8, 8, 9, 9, 9, 9, 9, + 10,10,11,11, 0, 9, 9, 9, 8, 9, 9, 9, 9,10,10,11, + 11, 0,13,13, 9, 9,10,10,10,10,11,11,12,12, 0,14, + 13, 9, 9,10,10,10,10,11,11,12,12, 0, 0, 0,10,10, + 9, 9,11,11,12,12,13,12, 0, 0, 0,10,10, 9, 9,10, + 10,12,12,13,13, 0, 0, 0,13,14,11,10,11,11,12,12, + 13,14, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,12,12,12,12,13,13,14,15, 0, 0, 0, 0, + 0,12,12,12,12,13,13,14,15, + }; + + static float _vq_quantthresh__16c1_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__16c1_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p8_0 = { + _vq_quantthresh__16c1_s_p8_0, + _vq_quantmap__16c1_s_p8_0, + 13, + 13 + }; + + static static_codebook _16c1_s_p8_0 = { + 2, 169, + _vq_lengthlist__16c1_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__16c1_s_p8_0, + NULL, + &_vq_auxt__16c1_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c1_s_p8_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__16c1_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c1_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p8_1 = { + _vq_quantthresh__16c1_s_p8_1, + _vq_quantmap__16c1_s_p8_1, + 5, + 5 + }; + + static static_codebook _16c1_s_p8_1 = { + 2, 25, + _vq_lengthlist__16c1_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c1_s_p8_1, + NULL, + &_vq_auxt__16c1_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__16c1_s_p9_0[] = { + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__16c1_s_p9_0[] = { + -1732.5, -1417.5, -1102.5, -787.5, -472.5, -157.5, 157.5, 472.5, + 787.5, 1102.5, 1417.5, 1732.5, + }; + + static long _vq_quantmap__16c1_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p9_0 = { + _vq_quantthresh__16c1_s_p9_0, + _vq_quantmap__16c1_s_p9_0, + 13, + 13 + }; + + static static_codebook _16c1_s_p9_0 = { + 2, 169, + _vq_lengthlist__16c1_s_p9_0, + 1, -513964032, 1628680192, 4, 0, + _vq_quantlist__16c1_s_p9_0, + NULL, + &_vq_auxt__16c1_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__16c1_s_p9_1[] = { + 1, 4, 4, 4, 4, 8, 8,12,13,14,14,14,14,14,14, 6, + 6, 6, 6, 6,10, 9,14,14,14,14,14,14,14,14, 7, 6, + 5, 6, 6,10, 9,12,13,13,13,13,13,13,13,13, 7, 7, + 9, 9,11,11,12,13,13,13,13,13,13,13,13, 7, 7, 8, + 8,11,12,13,13,13,13,13,13,13,13,13,12,12,10,10, + 13,12,13,13,13,13,13,13,13,13,13,12,12,10,10,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,12,13,12, + 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,12,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,12,13,13,13,13,13,13, + 13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13, + 13, + }; + + static float _vq_quantthresh__16c1_s_p9_1[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__16c1_s_p9_1[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p9_1 = { + _vq_quantthresh__16c1_s_p9_1, + _vq_quantmap__16c1_s_p9_1, + 15, + 15 + }; + + static static_codebook _16c1_s_p9_1 = { + 2, 225, + _vq_lengthlist__16c1_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__16c1_s_p9_1, + NULL, + &_vq_auxt__16c1_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c1_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__16c1_s_p9_2[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9,10, + 10,10, 9,10,10,11,12,12, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,10,10,10,11,11,10,12,11,11,13,11, 7, 7, 8, + 8, 8, 8, 9, 9, 9,10,10,10,10, 9,10,10,11,11,12, + 11,11, 8, 8, 8, 8, 9, 9,10,10,10,10,11,11,11,11, + 11,11,11,12,11,12,12, 8, 8, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,11,11,11,11,11,11,12,11, 9, 9, 9, 9, + 10,10,10,10,11,10,11,11,11,11,11,11,12,12,12,12, + 11, 9, 9, 9, 9,10,10,10,10,11,11,11,11,11,11,11, + 11,11,12,12,12,13, 9,10,10, 9,11,10,10,10,10,11, + 11,11,11,11,10,11,12,11,12,12,11,12,11,10, 9,10, + 10,11,10,11,11,11,11,11,11,11,11,11,12,12,11,12, + 12,12,10,10,10,11,10,11,11,11,11,11,11,11,11,11, + 11,11,12,13,12,12,11, 9,10,10,11,11,10,11,11,11, + 12,11,11,11,11,11,12,12,13,13,12,13,10,10,12,10, + 11,11,11,11,11,11,11,11,11,12,12,11,13,12,12,12, + 12,13,12,11,11,11,11,11,11,12,11,12,11,11,11,11, + 12,12,13,12,11,12,12,11,11,11,11,11,12,11,11,11, + 11,12,11,11,12,11,12,13,13,12,12,12,12,11,11,11, + 11,11,12,11,11,12,11,12,11,11,11,11,13,12,12,12, + 12,13,11,11,11,12,12,11,11,11,12,11,12,12,12,11, + 12,13,12,11,11,12,12,11,12,11,11,11,12,12,11,12, + 11,11,11,12,12,12,12,13,12,13,12,12,12,12,11,11, + 12,11,11,11,11,11,11,12,12,12,13,12,11,13,13,12, + 12,11,12,10,11,11,11,11,12,11,12,12,11,12,12,13, + 12,12,13,12,12,12,12,12,11,12,12,12,11,12,11,11, + 11,12,13,12,13,13,13,13,13,12,13,13,12,12,13,11, + 11,11,11,11,12,11,11,12,11, + }; + + static float _vq_quantthresh__16c1_s_p9_2[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__16c1_s_p9_2[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__16c1_s_p9_2 = { + _vq_quantthresh__16c1_s_p9_2, + _vq_quantmap__16c1_s_p9_2, + 21, + 21 + }; + + static static_codebook _16c1_s_p9_2 = { + 2, 441, + _vq_lengthlist__16c1_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__16c1_s_p9_2, + NULL, + &_vq_auxt__16c1_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__16c1_s_short[] = { + 5, 6,17, 8,12, 9,10,10,12,13, 5, 2,17, 4, 9, 5, + 7, 8,11,13,16,16,16,16,16,16,16,16,16,16, 6, 4, + 16, 5,10, 5, 7,10,14,16,13, 9,16,11, 8, 7, 8, 9, + 13,16, 7, 4,16, 5, 7, 4, 6, 8,11,13, 8, 6,16, 7, + 8, 5, 5, 7, 9,13, 9, 8,16, 9, 8, 6, 6, 7, 9,13, + 11,11,16,10,10, 7, 7, 7, 9,13,13,13,16,13,13, 9, + 9, 9,10,13, + }; + + static static_codebook _huff_book__16c1_s_short = { + 2, 100, + _huff_lengthlist__16c1_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__16c2_s_long[] = { + 4, 7, 9, 9, 9, 8, 9,10,15,19, 5, 4, 5, 6, 7, 7, + 8, 9,14,16, 6, 5, 4, 5, 6, 7, 8,10,12,19, 7, 6, + 5, 4, 5, 6, 7, 9,11,18, 8, 7, 6, 5, 5, 5, 7, 9, + 10,17, 8, 7, 7, 5, 5, 5, 6, 7,12,18, 8, 8, 8, 7, + 7, 5, 5, 7,12,18, 8, 9,10, 9, 9, 7, 6, 7,12,17, + 14,18,16,16,15,12,11,10,12,18,15,17,18,18,18,15, + 14,14,16,18, + }; + + static static_codebook _huff_book__16c2_s_long = { + 2, 100, + _huff_lengthlist__16c2_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c2_s_p1_0[] = { + 1, 3, 3, 0, 0, 0, 0, 0, 0, 4, 5, 5, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c2_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__16c2_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p1_0 = { + _vq_quantthresh__16c2_s_p1_0, + _vq_quantmap__16c2_s_p1_0, + 3, + 3 + }; + + static static_codebook _16c2_s_p1_0 = { + 4, 81, + _vq_lengthlist__16c2_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__16c2_s_p1_0, + NULL, + &_vq_auxt__16c2_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c2_s_p2_0[] = { + 2, 4, 3, 7, 7, 0, 0, 0, 7, 8, 0, 0, 0, 8, 8, 0, + 0, 0, 8, 8, 0, 0, 0, 8, 8, 4, 5, 4, 8, 8, 0, 0, + 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, + 9, 9, 4, 4, 5, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, + 8, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 7, 8, 8,10,10, + 0, 0, 0,12,11, 0, 0, 0,11,11, 0, 0, 0,14,13, 0, + 0, 0,14,13, 7, 8, 8, 9,10, 0, 0, 0,11,12, 0, 0, + 0,11,11, 0, 0, 0,14,14, 0, 0, 0,13,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 8, 8,11,11, 0, 0, 0, + 11,11, 0, 0, 0,12,11, 0, 0, 0,12,12, 0, 0, 0,13, + 13, 8, 8, 8,11,11, 0, 0, 0,11,11, 0, 0, 0,11,12, + 0, 0, 0,12,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 8, 8, 8,12,11, 0, 0, 0,12,11, 0, + 0, 0,11,11, 0, 0, 0,13,13, 0, 0, 0,13,12, 8, 8, + 8,11,12, 0, 0, 0,11,12, 0, 0, 0,11,11, 0, 0, 0, + 13,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 9, 9,14,13, 0, 0, 0,13,12, 0, 0, 0,13, + 13, 0, 0, 0,13,12, 0, 0, 0,13,13, 8, 9, 9,13,14, + 0, 0, 0,12,13, 0, 0, 0,13,13, 0, 0, 0,12,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, + 9, 9,14,13, 0, 0, 0,13,13, 0, 0, 0,13,12, 0, 0, + 0,13,13, 0, 0, 0,13,12, 8, 9, 9,14,14, 0, 0, 0, + 13,13, 0, 0, 0,12,13, 0, 0, 0,13,13, 0, 0, 0,12, + 13, + }; + + static float _vq_quantthresh__16c2_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c2_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p2_0 = { + _vq_quantthresh__16c2_s_p2_0, + _vq_quantmap__16c2_s_p2_0, + 5, + 5 + }; + + static static_codebook _16c2_s_p2_0 = { + 4, 625, + _vq_lengthlist__16c2_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c2_s_p2_0, + NULL, + &_vq_auxt__16c2_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__16c2_s_p3_0[] = { + 1, 3, 3, 6, 6, 7, 7, 8, 8, 0, 0, 0, 6, 6, 7, 7, + 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 9, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c2_s_p3_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__16c2_s_p3_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p3_0 = { + _vq_quantthresh__16c2_s_p3_0, + _vq_quantmap__16c2_s_p3_0, + 9, + 9 + }; + + static static_codebook _16c2_s_p3_0 = { + 2, 81, + _vq_lengthlist__16c2_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__16c2_s_p3_0, + NULL, + &_vq_auxt__16c2_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__16c2_s_p4_0[] = { + 2, 3, 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9,10, + 10, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10, + 11,11, 0, 0, 0, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10, + 10,10,11, 0, 0, 0, 6, 6, 8, 8, 8, 8, 9, 9,10,10, + 10,11,11,11, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9, + 10,10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, + 9,10,10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__16c2_s_p4_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__16c2_s_p4_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p4_0 = { + _vq_quantthresh__16c2_s_p4_0, + _vq_quantmap__16c2_s_p4_0, + 17, + 17 + }; + + static static_codebook _16c2_s_p4_0 = { + 2, 289, + _vq_lengthlist__16c2_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__16c2_s_p4_0, + NULL, + &_vq_auxt__16c2_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p5_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__16c2_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6,10,10,10,10, + 10,10, 4, 7, 6,10,10,10,10,10,10, 5, 9, 9, 9,12, + 11,10,11,12, 7,10,10,12,12,12,12,12,12, 7,10,10, + 11,12,12,12,12,13, 6,10,10,10,12,12,10,12,12, 7, + 10,10,11,13,12,12,12,12, 7,10,10,11,12,12,12,12, + 12, + }; + + static float _vq_quantthresh__16c2_s_p5_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__16c2_s_p5_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p5_0 = { + _vq_quantthresh__16c2_s_p5_0, + _vq_quantmap__16c2_s_p5_0, + 3, + 3 + }; + + static static_codebook _16c2_s_p5_0 = { + 4, 81, + _vq_lengthlist__16c2_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__16c2_s_p5_0, + NULL, + &_vq_auxt__16c2_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__16c2_s_p5_1[] = { + 2, 3, 3, 6, 6, 7, 7, 7, 7, 8, 8,11,11,11, 6, 6, + 7, 7, 8, 8, 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, 8, + 8,11,11,11, 6, 6, 8, 8, 8, 8, 9, 9,11,11,11, 6, + 6, 8, 8, 8, 8, 9, 9,11,11,11, 7, 7, 8, 8, 8, 8, + 8, 8,11,11,11, 7, 7, 8, 8, 8, 8, 8, 9,11,11,11, + 8, 8, 8, 8, 8, 8, 8, 8,11,11,11,11,11, 8, 8, 8, + 8, 8, 8,11,11,11,11,11, 8, 8, 8, 8, 8, 8,11,11, + 11,11,11, 7, 7, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__16c2_s_p5_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__16c2_s_p5_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p5_1 = { + _vq_quantthresh__16c2_s_p5_1, + _vq_quantmap__16c2_s_p5_1, + 11, + 11 + }; + + static static_codebook _16c2_s_p5_1 = { + 2, 121, + _vq_lengthlist__16c2_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__16c2_s_p5_1, + NULL, + &_vq_auxt__16c2_s_p5_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__16c2_s_p6_0[] = { + 1, 4, 4, 7, 6, 8, 8, 9, 9,10,10,11,11, 5, 5, 5, + 7, 7, 9, 9, 9, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9,10,10,11,11,12,12, 0, 6, 6, 7, 7, 9, 9,10,10, + 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,12,12, + 12, 0,11,11, 8, 8,10,10,11,11,12,12,13,13, 0,11, + 12, 8, 8,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + static float _vq_quantthresh__16c2_s_p6_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__16c2_s_p6_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p6_0 = { + _vq_quantthresh__16c2_s_p6_0, + _vq_quantmap__16c2_s_p6_0, + 13, + 13 + }; + + static static_codebook _16c2_s_p6_0 = { + 2, 169, + _vq_lengthlist__16c2_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__16c2_s_p6_0, + NULL, + &_vq_auxt__16c2_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__16c2_s_p6_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__16c2_s_p6_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__16c2_s_p6_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p6_1 = { + _vq_quantthresh__16c2_s_p6_1, + _vq_quantmap__16c2_s_p6_1, + 5, + 5 + }; + + static static_codebook _16c2_s_p6_1 = { + 2, 25, + _vq_lengthlist__16c2_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__16c2_s_p6_1, + NULL, + &_vq_auxt__16c2_s_p6_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__16c2_s_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 5, 5, + 8, 8, 9, 9,10,10,11,11,12,12, 6, 5, 5, 8, 8, 9, + 9,10,10,11,11,12,13,18, 6, 6, 7, 7, 9, 9,10,10, + 12,12,13,13,18, 6, 6, 7, 7, 9, 9,10,10,12,12,13, + 13,18,11,10, 8, 8,10,10,11,11,12,12,13,13,18,11, + 11, 8, 8,10,10,11,11,12,13,13,13,18,18,18,10,11, + 11,11,12,12,13,13,14,14,18,18,18,11,11,11,11,12, + 12,13,13,14,14,18,18,18,14,14,12,12,12,12,14,14, + 15,14,18,18,18,15,15,11,12,12,12,13,13,15,15,18, + 18,18,18,18,13,13,13,13,13,14,17,16,18,18,18,18, + 18,13,14,13,13,14,13,15,14, + }; + + static float _vq_quantthresh__16c2_s_p7_0[] = { + -60.5, -49.5, -38.5, -27.5, -16.5, -5.5, 5.5, 16.5, + 27.5, 38.5, 49.5, 60.5, + }; + + static long _vq_quantmap__16c2_s_p7_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p7_0 = { + _vq_quantthresh__16c2_s_p7_0, + _vq_quantmap__16c2_s_p7_0, + 13, + 13 + }; + + static static_codebook _16c2_s_p7_0 = { + 2, 169, + _vq_lengthlist__16c2_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + _vq_quantlist__16c2_s_p7_0, + NULL, + &_vq_auxt__16c2_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__16c2_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7, 9, 9, 9, 6, 6, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 6, 6, 7, 7, 8, 8, 8, + 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, + 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, + 7, 7, 8, 8, 7, 7, 8, 8, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 8, 8, 9, 9, 9, 9, 9, 8, 8, 7, 7, 8, 8, 9, 9, + 9, 9, 9, 7, 7, 7, 7, 8, 8, + }; + + static float _vq_quantthresh__16c2_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__16c2_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p7_1 = { + _vq_quantthresh__16c2_s_p7_1, + _vq_quantmap__16c2_s_p7_1, + 11, + 11 + }; + + static static_codebook _16c2_s_p7_1 = { + 2, 121, + _vq_lengthlist__16c2_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__16c2_s_p7_1, + NULL, + &_vq_auxt__16c2_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__16c2_s_p8_0[] = { + 1, 4, 4, 7, 6, 7, 7, 6, 6, 8, 8, 9, 9,10,10, 6, + 6, 6, 8, 8, 9, 8, 8, 8, 9, 9,11,10,11,11, 7, 6, + 6, 8, 8, 9, 8, 7, 7, 9, 9,10,10,12,11,14, 8, 8, + 8, 9, 9, 9, 9, 9,10, 9,10,10,11,13,14, 8, 8, 8, + 8, 9, 9, 8, 8, 9, 9,10,10,11,12,14,13,11, 9, 9, + 9, 9, 9, 9, 9,10,11,10,13,12,14,11,13, 8, 9, 9, + 9, 9, 9,10,10,11,10,13,12,14,14,14, 8, 9, 9, 9, + 11,11,11,11,11,12,13,13,14,14,14, 9, 8, 9, 9,10, + 10,12,10,11,12,12,14,14,14,14,11,12,10,10,12,12, + 12,12,13,14,12,12,14,14,14,12,12, 9,10,11,11,12, + 14,12,14,14,14,14,14,14,14,14,11,11,12,11,12,14, + 14,14,14,14,14,14,14,14,14,12,11,11,11,11,14,14, + 14,14,14,14,14,14,14,14,14,14,13,12,14,14,14,14, + 14,14,14,14,14,14,14,14,14,12,12,12,13,14,14,13, + 13, + }; + + static float _vq_quantthresh__16c2_s_p8_0[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__16c2_s_p8_0[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p8_0 = { + _vq_quantthresh__16c2_s_p8_0, + _vq_quantmap__16c2_s_p8_0, + 15, + 15 + }; + + static static_codebook _16c2_s_p8_0 = { + 2, 225, + _vq_lengthlist__16c2_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__16c2_s_p8_0, + NULL, + &_vq_auxt__16c2_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__16c2_s_p8_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 7, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8,11,12,11, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10, 9, 9,11,11,10, 7, 7, 8, + 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 11,11, 8, 7, 8, 8, 9, 9, 9, 9, 9, 9,10,10, 9,10, + 10, 9,10,10,11,11,12, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10, 9,10,10,10,10,11,11,11, 8, 8, 9, 9, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 9, 8, 9, 9, 9, 9,10, 9, 9, 9,10,10,10, + 10, 9,10,11,11,11, 9, 9, 9, 9,10, 9, 9, 9,10,10, + 9,10, 9,10,10,10,10,10,11,12,11,11,11, 9, 9, 9, + 9, 9,10,10, 9,10,10,10,10,10,10,10,10,12,11,13, + 13,11, 9, 9, 9, 9,10,10, 9,10,10,10,10,11,10,10, + 10,10,11,12,11,12,11, 9, 9, 9,10,10, 9,10,10,10, + 10,10,10,10,10,10,10,11,11,11,12,11, 9,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,11,12,12,12, + 11,11,11,10, 9,10,10,10,10,10,10,10,10,11,10,10, + 10,11,11,11,11,11,11,11,10,10,10,11,10,10,10,10, + 10,10,10,10,10,10,11,11,11,11,12,12,11,10,10,10, + 10,10,10,10,10,11,10,10,10,11,10,12,11,11,12,11, + 11,11,10,10,10,10,10,11,10,10,10,10,10,11,10,10, + 11,11,11,12,11,12,11,11,12,10,10,10,10,10,10,10, + 11,10,10,11,10,12,11,11,11,12,11,11,11,11,10,10, + 10,10,10,10,10,11,11,11,10,11,12,11,11,11,12,11, + 12,11,12,10,11,10,10,10,10,11,10,10,10,10,10,10, + 12,11,11,11,11,11,12,12,10,10,10,10,10,11,10,10, + 11,10,11,11,11,11,11,11,11,11,11,11,11,11,12,11, + 10,11,10,10,10,10,10,10,10, + }; + + static float _vq_quantthresh__16c2_s_p8_1[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__16c2_s_p8_1[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p8_1 = { + _vq_quantthresh__16c2_s_p8_1, + _vq_quantmap__16c2_s_p8_1, + 21, + 21 + }; + + static static_codebook _16c2_s_p8_1 = { + 2, 441, + _vq_lengthlist__16c2_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__16c2_s_p8_1, + NULL, + &_vq_auxt__16c2_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__16c2_s_p9_0[] = { + 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__16c2_s_p9_0[] = { + -5120.5, -4189.5, -3258.5, -2327.5, -1396.5, -465.5, 465.5, 1396.5, + 2327.5, 3258.5, 4189.5, 5120.5, + }; + + static long _vq_quantmap__16c2_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p9_0 = { + _vq_quantthresh__16c2_s_p9_0, + _vq_quantmap__16c2_s_p9_0, + 13, + 13 + }; + + static static_codebook _16c2_s_p9_0 = { + 2, 169, + _vq_lengthlist__16c2_s_p9_0, + 1, -510275072, 1631393792, 4, 0, + _vq_quantlist__16c2_s_p9_0, + NULL, + &_vq_auxt__16c2_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p9_1[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__16c2_s_p9_1[] = { + 1, 5, 5, 9, 8, 7, 7, 7, 6,10,11,11,11,11,11,11, + 11, 8, 7, 6, 8, 8,10, 9,10,10,10, 9,11,10,10,10, + 10,10, 8, 6, 6, 8, 8, 9, 8, 9, 8, 9,10,10,10,10, + 10,10,10,10, 8,10, 9, 9, 9, 9,10,10,10,10,10,10, + 10,10,10,10,10, 8, 9, 9, 9,10,10, 9,10,10,10,10, + 10,10,10,10,10,10,10,10, 9, 8, 9, 9,10,10,10,10, + 10,10,10,10,10,10,10,10, 9, 8, 8, 9, 9,10,10,10, + 10,10,10,10,10,10,10,10,10,10, 9,10, 9, 9,10,10, + 10,10,10,10,10,10,10,10,10,10,10, 9, 8, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 8,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10, 9,10, 9,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10, 9,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, + }; + + static float _vq_quantthresh__16c2_s_p9_1[] = { + -367.5, -318.5, -269.5, -220.5, -171.5, -122.5, -73.5, -24.5, + 24.5, 73.5, 122.5, 171.5, 220.5, 269.5, 318.5, 367.5, + }; + + static long _vq_quantmap__16c2_s_p9_1[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p9_1 = { + _vq_quantthresh__16c2_s_p9_1, + _vq_quantmap__16c2_s_p9_1, + 17, + 17 + }; + + static static_codebook _16c2_s_p9_1 = { + 2, 289, + _vq_lengthlist__16c2_s_p9_1, + 1, -518488064, 1622704128, 5, 0, + _vq_quantlist__16c2_s_p9_1, + NULL, + &_vq_auxt__16c2_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__16c2_s_p9_2[] = { + 13, + 12, + 14, + 11, + 15, + 10, + 16, + 9, + 17, + 8, + 18, + 7, + 19, + 6, + 20, + 5, + 21, + 4, + 22, + 3, + 23, + 2, + 24, + 1, + 25, + 0, + 26, + }; + + static long _vq_lengthlist__16c2_s_p9_2[] = { + 1, 4, 4, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 8, 7, 8, 7, 7, 4, 4, + }; + + static float _vq_quantthresh__16c2_s_p9_2[] = { + -12.5, -11.5, -10.5, -9.5, -8.5, -7.5, -6.5, -5.5, + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, + 11.5, 12.5, + }; + + static long _vq_quantmap__16c2_s_p9_2[] = { + 25, 23, 21, 19, 17, 15, 13, 11, + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, 12, 14, 16, 18, 20, + 22, 24, 26, + }; + + static encode_aux_threshmatch _vq_auxt__16c2_s_p9_2 = { + _vq_quantthresh__16c2_s_p9_2, + _vq_quantmap__16c2_s_p9_2, + 27, + 27 + }; + + static static_codebook _16c2_s_p9_2 = { + 1, 27, + _vq_lengthlist__16c2_s_p9_2, + 1, -528875520, 1611661312, 5, 0, + _vq_quantlist__16c2_s_p9_2, + NULL, + &_vq_auxt__16c2_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__16c2_s_short[] = { + 7,10,11,11,11,14,15,15,17,14, 8, 6, 7, 7, 8, 9, + 11,11,14,17, 9, 6, 6, 6, 7, 7,10,11,15,16, 9, 6, + 6, 4, 4, 5, 8, 9,12,16,10, 6, 6, 4, 4, 4, 6, 9, + 13,16,10, 7, 6, 5, 4, 3, 5, 7,13,16,11, 9, 8, 7, + 6, 5, 5, 6,12,15,10,10,10, 9, 7, 6, 6, 7,11,15, + 13,13,13,13,11,10,10, 9,12,16,16,16,16,14,16,15, + 15,12,14,14, + }; + + static static_codebook _huff_book__16c2_s_short = { + 2, 100, + _huff_lengthlist__16c2_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c0_s_long[] = { + 3, 4,18, 8, 8, 8, 9,10,11,13, 3, 2,18, 5, 5, 6, + 8,11,12,12,18,18,18,18,18,18,18,18,18,18, 8, 5, + 18, 7, 8, 8,10,14,14,16, 8, 5,18, 7, 5, 6, 7,11, + 12,13, 8, 6,18, 7, 5, 6, 7,10,12,14, 8, 7,18,10, + 7, 6, 6, 8,11,14, 9,10,18,13, 9, 7, 6, 8,10,13, + 11,13,18,16,13,10, 9, 8, 8,11,12,17,18,17,18,14, + 11, 9,10,14, + }; + + static static_codebook _huff_book__44c0_s_long = { + 2, 100, + _huff_lengthlist__44c0_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c0_s_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9, 9,11, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c0_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p1_0 = { + _vq_quantthresh__44c0_s_p1_0, + _vq_quantmap__44c0_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c0_s_p1_0 = { + 8, 6561, + _vq_lengthlist__44c0_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c0_s_p1_0, + NULL, + &_vq_auxt__44c0_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_s_p2_0[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c0_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p2_0 = { + _vq_quantthresh__44c0_s_p2_0, + _vq_quantmap__44c0_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c0_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c0_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c0_s_p2_0, + NULL, + &_vq_auxt__44c0_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 5, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 7, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c0_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p3_0 = { + _vq_quantthresh__44c0_s_p3_0, + _vq_quantmap__44c0_s_p3_0, + 5, + 5 + }; + + static static_codebook _44c0_s_p3_0 = { + 4, 625, + _vq_lengthlist__44c0_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c0_s_p3_0, + NULL, + &_vq_auxt__44c0_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c0_s_p4_0[] = { + 1, 3, 2, 8, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c0_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p4_0 = { + _vq_quantthresh__44c0_s_p4_0, + _vq_quantmap__44c0_s_p4_0, + 9, + 9 + }; + + static static_codebook _44c0_s_p4_0 = { + 2, 81, + _vq_lengthlist__44c0_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c0_s_p4_0, + NULL, + &_vq_auxt__44c0_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c0_s_p5_0[] = { + 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 0, 0, 6, 7, 7, 7, + 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, 7, 7, + 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8,10, 9, 0, 0, 0, + 8, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10, 9, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, + }; + + static float _vq_quantthresh__44c0_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c0_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p5_0 = { + _vq_quantthresh__44c0_s_p5_0, + _vq_quantmap__44c0_s_p5_0, + 9, + 9 + }; + + static static_codebook _44c0_s_p5_0 = { + 2, 81, + _vq_lengthlist__44c0_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c0_s_p5_0, + NULL, + &_vq_auxt__44c0_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c0_s_p6_0[] = { + 1, 3, 4, 6, 6, 7, 8, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9,10,10,10, + 10,11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9,10, + 10,11,11,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, + 9,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10, 9,10,10,11,11,11,12,12,13,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,12,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, + 14, + }; + + static float _vq_quantthresh__44c0_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c0_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p6_0 = { + _vq_quantthresh__44c0_s_p6_0, + _vq_quantmap__44c0_s_p6_0, + 17, + 17 + }; + + static static_codebook _44c0_s_p6_0 = { + 2, 289, + _vq_lengthlist__44c0_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c0_s_p6_0, + NULL, + &_vq_auxt__44c0_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c0_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 7,10,10,10,11, + 10,11,10,10, 6, 9, 9,11,10,10,11, 9,10, 6, 9, 9, + 11,10,10,11, 9, 9, 7,10,10,11,11,11,12,11,11, 7, + 9, 9,10, 9, 9,11,11,10, 7, 9, 9,10,10,10,12,10, + 11, + }; + + static float _vq_quantthresh__44c0_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c0_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p7_0 = { + _vq_quantthresh__44c0_s_p7_0, + _vq_quantmap__44c0_s_p7_0, + 3, + 3 + }; + + static static_codebook _44c0_s_p7_0 = { + 4, 81, + _vq_lengthlist__44c0_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c0_s_p7_0, + NULL, + &_vq_auxt__44c0_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c0_s_p7_1[] = { + 2, 3, 3, 6, 6, 7, 7, 7, 7, 7, 7,10, 9, 9, 6, 6, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 6, 6, 7, 7, 8, 8, 8, + 8,10, 9,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 8, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c0_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c0_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p7_1 = { + _vq_quantthresh__44c0_s_p7_1, + _vq_quantmap__44c0_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c0_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c0_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c0_s_p7_1, + NULL, + &_vq_auxt__44c0_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c0_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 9, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 8, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 8, 9, 9,10,10,10,11,12,11, 0,13, + 13, 9, 8, 9, 9,10,10,10,11,11,11, 0, 0, 0,10,10, + 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 8,10, + 10,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, + 12,12, 0, 0, 0,15,15,10,10,11, 9,12,12,13,13, 0, + 0, 0, 0, 0,12,11,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,11,12,11,14,13, + }; + + static float _vq_quantthresh__44c0_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c0_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p8_0 = { + _vq_quantthresh__44c0_s_p8_0, + _vq_quantmap__44c0_s_p8_0, + 13, + 13 + }; + + static static_codebook _44c0_s_p8_0 = { + 2, 169, + _vq_lengthlist__44c0_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c0_s_p8_0, + NULL, + &_vq_auxt__44c0_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_s_p8_1[] = { + 2, 3, 4, 4, 4, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c0_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c0_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p8_1 = { + _vq_quantthresh__44c0_s_p8_1, + _vq_quantmap__44c0_s_p8_1, + 5, + 5 + }; + + static static_codebook _44c0_s_p8_1 = { + 2, 25, + _vq_lengthlist__44c0_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c0_s_p8_1, + NULL, + &_vq_auxt__44c0_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p9_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_s_p9_0[] = { + 1, 7, 7,11,11,10,11,11,11,11, 9,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11, 8,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11, 8,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, + }; + + static float _vq_quantthresh__44c0_s_p9_0[] = { + -331.5, -110.5, 110.5, 331.5, + }; + + static long _vq_quantmap__44c0_s_p9_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p9_0 = { + _vq_quantthresh__44c0_s_p9_0, + _vq_quantmap__44c0_s_p9_0, + 5, + 5 + }; + + static static_codebook _44c0_s_p9_0 = { + 4, 625, + _vq_lengthlist__44c0_s_p9_0, + 1, -518283264, 1627103232, 3, 0, + _vq_quantlist__44c0_s_p9_0, + NULL, + &_vq_auxt__44c0_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c0_s_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,12,12,13,12, 6, 5, 5, + 7, 7, 8, 8,10,10,12,11,14,13, 6, 5, 5, 7, 7, 7, + 8, 9, 9,11,12,13,12,15, 7, 7, 7, 7, 9, 9,11,11, + 14,13,14,13,15, 7, 7, 8, 8, 8, 9,10,10,11,11,12, + 11,15,10,10, 8, 8,10,10,12,11,13,15,14,14,15,11, + 10, 8, 8,11,11,11,11,13,13,12,13,15,15,15,10,10, + 10,10,12,13,13,13,15,14,15,15,15,10,10,10,11,13, + 14,13,14,14,14,15,15,15,15,15,11,12,11,13,14,14, + 15,15,15,15,15,14,15,11,11,13,12,14,13,15,15,15, + 15,15,15,15,13,12,13,12,15,15,15,15,15,15,15,15, + 15,12,13,12,12,15,14,15,15, + }; + + static float _vq_quantthresh__44c0_s_p9_1[] = { + -93.5, -76.5, -59.5, -42.5, -25.5, -8.5, 8.5, 25.5, + 42.5, 59.5, 76.5, 93.5, + }; + + static long _vq_quantmap__44c0_s_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p9_1 = { + _vq_quantthresh__44c0_s_p9_1, + _vq_quantmap__44c0_s_p9_1, + 13, + 13 + }; + + static static_codebook _44c0_s_p9_1 = { + 2, 169, + _vq_lengthlist__44c0_s_p9_1, + 1, -522616832, 1620115456, 4, 0, + _vq_quantlist__44c0_s_p9_1, + NULL, + &_vq_auxt__44c0_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_s_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c0_s_p9_2[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 8, + 9,10,10,10, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,11,10,10, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9,10, 9, 9,10,10,11, 9, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,11,11,10,11,11, 9, 9, + 9, 9, 9, 9,10, 9, 9, 9,10, 9,10,10,10,11,11, 9, + 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10,11,10,10,10,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, + 11,11,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 11,11,10,10, 9,10,10,10, 9,10, 9, 9, 9, 9,10,10, + 11,10,11,11,11, 9,10, 9, 9, 9, 9, 9, 9, 9,10,10, + 11,10,11,11,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,11,11,10,11,11, 9, 9, 9, 9, 9, 9, 9, + 9, + }; + + static float _vq_quantthresh__44c0_s_p9_2[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c0_s_p9_2[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_s_p9_2 = { + _vq_quantthresh__44c0_s_p9_2, + _vq_quantmap__44c0_s_p9_2, + 17, + 17 + }; + + static static_codebook _44c0_s_p9_2 = { + 2, 289, + _vq_lengthlist__44c0_s_p9_2, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c0_s_p9_2, + NULL, + &_vq_auxt__44c0_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c0_s_short[] = { + 6, 8,17,12,12,12,14,15,17,16, 5, 1,16, 5, 6, 6, + 9,12,14,13,16,16,16,16,16,16,16,16,16,16, 9, 4, + 16, 6, 9, 7,10,14,14,14, 8, 5,16, 8, 6, 7,10,13, + 15,16, 9, 6,16, 7, 7, 7,10,12,15,14,10, 8,16, 9, + 9, 9,10,12,15,14,13, 7,16, 8, 7, 7,10,12,14,13, + 15, 6,16, 7, 5, 5, 7, 9,13,16,14, 7,16, 8, 6, 6, + 8, 9,11,14, + }; + + static static_codebook _huff_book__44c0_s_short = { + 2, 100, + _huff_lengthlist__44c0_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c0_sm_long[] = { + 3, 4,10, 8,11, 9,10,10,11,13, 3, 2,10, 5, 8, 6, + 8,11,12,13,10, 8, 7,10, 7, 8, 9,11,12,13, 8, 5, + 12, 6, 9, 7,10,13,14,16,11, 7, 7, 9, 5, 6, 7,10, + 13,13, 8, 6, 7, 7, 5, 5, 6, 9,12,13, 9, 8, 8, 8, + 7, 6, 6, 8,11,14,10,10,10,11, 9, 8, 7, 8,10,13, + 11,14,12,15,13,11, 9, 8, 9,12,12,18,15,18,17,15, + 12,10,10,14, + }; + + static static_codebook _huff_book__44c0_sm_long = { + 2, 100, + _huff_lengthlist__44c0_sm_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c0_sm_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_sm_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c0_sm_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p1_0 = { + _vq_quantthresh__44c0_sm_p1_0, + _vq_quantmap__44c0_sm_p1_0, + 3, + 3 + }; + + static static_codebook _44c0_sm_p1_0 = { + 8, 6561, + _vq_lengthlist__44c0_sm_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c0_sm_p1_0, + NULL, + &_vq_auxt__44c0_sm_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_sm_p2_0[] = { + 1, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 6, 6, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 8, + 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, 0, 8, 8, 0, 0, + 0, 8, 8, 0, 0, 0,10, 9, 0, 0, 0, 0, 0, 0, 0, 6, + 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, + 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8,10,10, 0, 0, 0,10,10, 0, 0, 0, 9,10, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0,10, + 10, 0, 0, 0,10, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_sm_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c0_sm_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p2_0 = { + _vq_quantthresh__44c0_sm_p2_0, + _vq_quantmap__44c0_sm_p2_0, + 5, + 5 + }; + + static static_codebook _44c0_sm_p2_0 = { + 4, 625, + _vq_lengthlist__44c0_sm_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c0_sm_p2_0, + NULL, + &_vq_auxt__44c0_sm_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_sm_p3_0[] = { + 2, 3, 4, 6, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_sm_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c0_sm_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p3_0 = { + _vq_quantthresh__44c0_sm_p3_0, + _vq_quantmap__44c0_sm_p3_0, + 5, + 5 + }; + + static static_codebook _44c0_sm_p3_0 = { + 4, 625, + _vq_lengthlist__44c0_sm_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c0_sm_p3_0, + NULL, + &_vq_auxt__44c0_sm_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c0_sm_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c0_sm_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c0_sm_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p4_0 = { + _vq_quantthresh__44c0_sm_p4_0, + _vq_quantmap__44c0_sm_p4_0, + 9, + 9 + }; + + static static_codebook _44c0_sm_p4_0 = { + 2, 81, + _vq_lengthlist__44c0_sm_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c0_sm_p4_0, + NULL, + &_vq_auxt__44c0_sm_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c0_sm_p5_0[] = { + 1, 3, 3, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, 8, 8, + 9, 9, 0, 6, 6, 7, 7, 8, 8,10,10, 0, 7, 7, 8, 8, + 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 8, 8, 9, 9,11,11, 0, 0, 0, 9, 9, 9, 9,11,11, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, + }; + + static float _vq_quantthresh__44c0_sm_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c0_sm_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p5_0 = { + _vq_quantthresh__44c0_sm_p5_0, + _vq_quantmap__44c0_sm_p5_0, + 9, + 9 + }; + + static static_codebook _44c0_sm_p5_0 = { + 2, 81, + _vq_lengthlist__44c0_sm_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c0_sm_p5_0, + NULL, + &_vq_auxt__44c0_sm_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c0_sm_p6_0[] = { + 1, 4, 4, 6, 6, 8, 8, 9, 9, 8, 8,10,10,10,10,11, + 11, 0, 6, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 6, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 7, 7, 8, 8, 8, 8,10,10,10,10,11,11, + 11,11,12,12, 0, 0, 0, 8, 7, 8, 8,10,10,10,10,11, + 11,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10, + 10,11,11,12,12,12,13, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,12,13,13,13, 0, 0, 0, 0, 0, 9, + 9,10, 9,11,11,12,12,13,13,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,14, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, + }; + + static float _vq_quantthresh__44c0_sm_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c0_sm_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p6_0 = { + _vq_quantthresh__44c0_sm_p6_0, + _vq_quantmap__44c0_sm_p6_0, + 17, + 17 + }; + + static static_codebook _44c0_sm_p6_0 = { + 2, 289, + _vq_lengthlist__44c0_sm_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c0_sm_p6_0, + NULL, + &_vq_auxt__44c0_sm_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c0_sm_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 5, 7, 6,10, 9, 9,10, + 9, 9, 4, 7, 7,10, 9, 9,11, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10,10,10,11, 9,10, 6, 9, 9, + 10,10,10,11,10, 9, 7,10,10,11,11,11,11,11,11, 6, + 9, 9,10, 9,10,11,11,10, 6, 9, 9,10,10,10,11,10, + 11, + }; + + static float _vq_quantthresh__44c0_sm_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c0_sm_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p7_0 = { + _vq_quantthresh__44c0_sm_p7_0, + _vq_quantmap__44c0_sm_p7_0, + 3, + 3 + }; + + static static_codebook _44c0_sm_p7_0 = { + 4, 81, + _vq_lengthlist__44c0_sm_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c0_sm_p7_0, + NULL, + &_vq_auxt__44c0_sm_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c0_sm_p7_1[] = { + 2, 4, 4, 5, 5, 7, 7, 7, 7, 7, 7, 9, 5, 5, 7, 7, + 7, 7, 8, 8, 8, 8, 9, 5, 5, 7, 7, 7, 7, 8, 8, 8, + 8,10, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, + 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c0_sm_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c0_sm_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p7_1 = { + _vq_quantthresh__44c0_sm_p7_1, + _vq_quantmap__44c0_sm_p7_1, + 11, + 11 + }; + + static static_codebook _44c0_sm_p7_1 = { + 2, 121, + _vq_lengthlist__44c0_sm_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c0_sm_p7_1, + NULL, + &_vq_auxt__44c0_sm_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c0_sm_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 9, 9,10,10, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10,10,11,11,12,11, 0,12, + 12, 9, 9, 9, 9,10,10,11,11,12,11, 0, 0, 0, 9, 9, + 9,10,11,11,11,11,12,12, 0, 0, 0,10,10, 9, 9,11, + 11,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,10,12,12,13,13, 0, + 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,10,12,11,14,14, + }; + + static float _vq_quantthresh__44c0_sm_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c0_sm_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p8_0 = { + _vq_quantthresh__44c0_sm_p8_0, + _vq_quantmap__44c0_sm_p8_0, + 13, + 13 + }; + + static static_codebook _44c0_sm_p8_0 = { + 2, 169, + _vq_lengthlist__44c0_sm_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c0_sm_p8_0, + NULL, + &_vq_auxt__44c0_sm_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c0_sm_p8_1[] = { + 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c0_sm_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c0_sm_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p8_1 = { + _vq_quantthresh__44c0_sm_p8_1, + _vq_quantmap__44c0_sm_p8_1, + 5, + 5 + }; + + static static_codebook _44c0_sm_p8_1 = { + 2, 25, + _vq_lengthlist__44c0_sm_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c0_sm_p8_1, + NULL, + &_vq_auxt__44c0_sm_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p9_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c0_sm_p9_0[] = { + 1, 3, 4,11,11,11,11,11,11, 4, 6, 6,10,10,10,10, + 10,10, 4, 6, 5,10,10,10,10,10,10,10, 6, 7,10, 9, + 10,10,10,10,10, 7, 9,10, 9,10,10,10,10,10, 9,10, + 7, 9,10,10,10,10,10,10,10, 9,10,10,10,10,10,10, + 10,10, 9,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, + }; + + static float _vq_quantthresh__44c0_sm_p9_0[] = { + -773.5, -552.5, -331.5, -110.5, 110.5, 331.5, 552.5, 773.5, + }; + + static long _vq_quantmap__44c0_sm_p9_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p9_0 = { + _vq_quantthresh__44c0_sm_p9_0, + _vq_quantmap__44c0_sm_p9_0, + 9, + 9 + }; + + static static_codebook _44c0_sm_p9_0 = { + 2, 81, + _vq_lengthlist__44c0_sm_p9_0, + 1, -516186112, 1627103232, 4, 0, + _vq_quantlist__44c0_sm_p9_0, + NULL, + &_vq_auxt__44c0_sm_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c0_sm_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,12,12,13,13, 6, 5, 5, + 7, 7, 8, 8,10,10,12,12,14,13, 6, 5, 5, 6, 7, 8, + 8,10, 9,11,12,13,12,18, 7, 7, 7, 7, 9, 9,11,11, + 14,14,14,13,17, 7, 7, 8, 7, 9, 9,10,10,12,11,13, + 12,18,10,10, 8, 8,10,10,12,11,13,14,16,15,17,11, + 11, 8, 8,11,11,11,12,13,13,13,15,18,18,18,10,11, + 10,10,12,13,14,13,17,14,17,17,17,10,10,11,11,14, + 14,14,13,14,14,18,18,18,17,15,11,12,12,13,15,15, + 16,17,18,16,18,14,15,11,11,14,13,14,14,16,17,18, + 17,17,17,18,14,13,13,12,17,15,17,16,18,17,18,18, + 18,12,13,12,13,16,14,18,18, + }; + + static float _vq_quantthresh__44c0_sm_p9_1[] = { + -93.5, -76.5, -59.5, -42.5, -25.5, -8.5, 8.5, 25.5, + 42.5, 59.5, 76.5, 93.5, + }; + + static long _vq_quantmap__44c0_sm_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p9_1 = { + _vq_quantthresh__44c0_sm_p9_1, + _vq_quantmap__44c0_sm_p9_1, + 13, + 13 + }; + + static static_codebook _44c0_sm_p9_1 = { + 2, 169, + _vq_lengthlist__44c0_sm_p9_1, + 1, -522616832, 1620115456, 4, 0, + _vq_quantlist__44c0_sm_p9_1, + NULL, + &_vq_auxt__44c0_sm_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c0_sm_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c0_sm_p9_2[] = { + 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, + 9,10, 6, 6, 7, 7, 8, 7, 8, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 8, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,11,10,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10, 9,10,11,10, 9, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,11, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,11,10,11,11, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,10,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10, + 11,11,10, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,11,10, + 11,11,10,10, 9,10,10,10, 9, 9, 9, 9, 9, 9,10,10, + 10,11,11,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, + 11,10,11,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,11,11,11,10,11,11, 9, 9, 9, 9, 9, 9, 9, + 9, + }; + + static float _vq_quantthresh__44c0_sm_p9_2[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c0_sm_p9_2[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c0_sm_p9_2 = { + _vq_quantthresh__44c0_sm_p9_2, + _vq_quantmap__44c0_sm_p9_2, + 17, + 17 + }; + + static static_codebook _44c0_sm_p9_2 = { + 2, 289, + _vq_lengthlist__44c0_sm_p9_2, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c0_sm_p9_2, + NULL, + &_vq_auxt__44c0_sm_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c0_sm_short[] = { + 5, 7,12,12,13,13,13,15,16,18, 4, 2,11, 5, 9, 7, + 9,12,13,14,13, 7, 8, 9, 8, 9,11,13,19,19, 9, 4, + 12, 5,10, 7, 9,12,15,14,11, 6, 7, 7, 5, 6, 8,11, + 15,17,10, 5, 8, 6, 6, 5, 6, 9,14,14,10, 5, 9, 7, + 7, 6, 6, 9,12,14,12, 6,10, 7, 7, 7, 8, 9,13,14, + 14, 7, 9, 7, 5, 5, 6, 9,11,13,14, 9,10, 9, 6, 6, + 7, 8,10,13, + }; + + static static_codebook _huff_book__44c0_sm_short = { + 2, 100, + _huff_lengthlist__44c0_sm_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c1_s_long[] = { + 3, 4,19, 9,10, 9, 9,10,11,12, 4, 2,19, 5, 6, 6, + 8,10,12,11,19,19,19,19,19,19,19,19,18,18, 8, 4, + 18, 6, 8, 7,10,13,14,13,10, 5,18, 7, 4, 6, 7,10, + 12,13, 9, 6,18, 7, 5, 6, 7,10,12,13, 9, 7,18, 9, + 7, 6, 6, 7,10,13, 9, 9,18,12, 9, 8, 6, 6, 9,12, + 10,12,18,15,12,11, 9, 8, 8,11,11,14,18,17,15,13, + 12, 9,10,12, + }; + + static static_codebook _huff_book__44c1_s_long = { + 2, 100, + _huff_lengthlist__44c1_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c1_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c1_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p1_0 = { + _vq_quantthresh__44c1_s_p1_0, + _vq_quantmap__44c1_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c1_s_p1_0 = { + 8, 6561, + _vq_lengthlist__44c1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c1_s_p1_0, + NULL, + &_vq_auxt__44c1_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c1_s_p2_0[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c1_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p2_0 = { + _vq_quantthresh__44c1_s_p2_0, + _vq_quantmap__44c1_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c1_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c1_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c1_s_p2_0, + NULL, + &_vq_auxt__44c1_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c1_s_p3_0[] = { + 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c1_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p3_0 = { + _vq_quantthresh__44c1_s_p3_0, + _vq_quantmap__44c1_s_p3_0, + 5, + 5 + }; + + static static_codebook _44c1_s_p3_0 = { + 4, 625, + _vq_lengthlist__44c1_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c1_s_p3_0, + NULL, + &_vq_auxt__44c1_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c1_s_p4_0[] = { + 1, 3, 2, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c1_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p4_0 = { + _vq_quantthresh__44c1_s_p4_0, + _vq_quantmap__44c1_s_p4_0, + 9, + 9 + }; + + static static_codebook _44c1_s_p4_0 = { + 2, 81, + _vq_lengthlist__44c1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c1_s_p4_0, + NULL, + &_vq_auxt__44c1_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c1_s_p5_0[] = { + 1, 3, 3, 5, 5, 6, 6, 8, 8, 0, 0, 0, 7, 7, 8, 7, + 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, 0, 0, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 8, 8, 9, 9,10,10, 0, 0, 0, 8, 8, 9, 9,10,10, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, + }; + + static float _vq_quantthresh__44c1_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c1_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p5_0 = { + _vq_quantthresh__44c1_s_p5_0, + _vq_quantmap__44c1_s_p5_0, + 9, + 9 + }; + + static static_codebook _44c1_s_p5_0 = { + 2, 81, + _vq_lengthlist__44c1_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c1_s_p5_0, + NULL, + &_vq_auxt__44c1_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c1_s_p6_0[] = { + 1, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10,10,10, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9,10,10, + 10,11,11,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,12,13,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, + 10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,13,12,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,11,12,12,12,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,11,11,12,12,13,13,14, + 14, + }; + + static float _vq_quantthresh__44c1_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c1_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p6_0 = { + _vq_quantthresh__44c1_s_p6_0, + _vq_quantmap__44c1_s_p6_0, + 17, + 17 + }; + + static static_codebook _44c1_s_p6_0 = { + 2, 289, + _vq_lengthlist__44c1_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c1_s_p6_0, + NULL, + &_vq_auxt__44c1_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c1_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10,11,10,10, 9, 9, 6, 9, 9, + 10,10,10,10, 9, 9, 7,10,10,11,10,10,11,11,11, 6, + 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10, 9, 9,11,10, + 10, + }; + + static float _vq_quantthresh__44c1_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c1_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p7_0 = { + _vq_quantthresh__44c1_s_p7_0, + _vq_quantmap__44c1_s_p7_0, + 3, + 3 + }; + + static static_codebook _44c1_s_p7_0 = { + 4, 81, + _vq_lengthlist__44c1_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c1_s_p7_0, + NULL, + &_vq_auxt__44c1_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c1_s_p7_1[] = { + 2, 3, 3, 6, 6, 7, 7, 7, 7, 8, 8,10,10,10, 6, 6, + 7, 7, 8, 8, 8, 8,10,10,10, 6, 6, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c1_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c1_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p7_1 = { + _vq_quantthresh__44c1_s_p7_1, + _vq_quantmap__44c1_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c1_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c1_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c1_s_p7_1, + NULL, + &_vq_auxt__44c1_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c1_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 7, 7, 9, 8,10,10, 6, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9,10,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10,10,10,11,12,11, 0,12, + 13, 9, 8, 9, 9,10,10,11,11,11,11, 0, 0, 0, 9, 9, + 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 9,10, + 10,11,11,12,12, 0, 0, 0,13,14,10,10,11,11,12,12, + 12,13, 0, 0, 0,14,14,10,10,11,10,12,12,13,13, 0, + 0, 0, 0, 0,12,11,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,10,12,11,14,13, + }; + + static float _vq_quantthresh__44c1_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c1_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p8_0 = { + _vq_quantthresh__44c1_s_p8_0, + _vq_quantmap__44c1_s_p8_0, + 13, + 13 + }; + + static static_codebook _44c1_s_p8_0 = { + 2, 169, + _vq_lengthlist__44c1_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c1_s_p8_0, + NULL, + &_vq_auxt__44c1_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c1_s_p8_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c1_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c1_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p8_1 = { + _vq_quantthresh__44c1_s_p8_1, + _vq_quantmap__44c1_s_p8_1, + 5, + 5 + }; + + static static_codebook _44c1_s_p8_1 = { + 2, 25, + _vq_lengthlist__44c1_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c1_s_p8_1, + NULL, + &_vq_auxt__44c1_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c1_s_p9_0[] = { + 1, 6, 6, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 7, 6, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 6, 6, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 8, + }; + + static float _vq_quantthresh__44c1_s_p9_0[] = { + -1215.5, -994.5, -773.5, -552.5, -331.5, -110.5, 110.5, 331.5, + 552.5, 773.5, 994.5, 1215.5, + }; + + static long _vq_quantmap__44c1_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p9_0 = { + _vq_quantthresh__44c1_s_p9_0, + _vq_quantmap__44c1_s_p9_0, + 13, + 13 + }; + + static static_codebook _44c1_s_p9_0 = { + 2, 169, + _vq_lengthlist__44c1_s_p9_0, + 1, -514541568, 1627103232, 4, 0, + _vq_quantlist__44c1_s_p9_0, + NULL, + &_vq_auxt__44c1_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c1_s_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,12,12,13,12, 6, 5, 5, + 7, 7, 8, 8,10,10,11,12,13,13, 6, 5, 5, 7, 7, 8, + 8, 9, 9,11,11,12,12,15, 7, 7, 7, 7, 9, 9,11,11, + 13,13,14,13,15, 7, 7, 8, 7, 9, 9,10,10,12,11,14, + 12,15,10,10, 8, 8,10,10,12,11,12,13,14,13,15,10, + 10, 8, 8,11,10,11,11,13,12,13,15,14,15,15,10,10, + 10,10,12,13,13,12,15,14,15,15,13,10,10,11,11,13, + 13,13,12,13,13,15,15,15,14,15,11,11,13,13,13,13, + 14,15,15,15,15,13,13,11,11,12,13,13,14,13,15,15, + 15,14,15,15,13,12,12,11,13,13,15,15,15,15,15,15, + 14,13,12,13,12,15,13,15,15, + }; + + static float _vq_quantthresh__44c1_s_p9_1[] = { + -93.5, -76.5, -59.5, -42.5, -25.5, -8.5, 8.5, 25.5, + 42.5, 59.5, 76.5, 93.5, + }; + + static long _vq_quantmap__44c1_s_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p9_1 = { + _vq_quantthresh__44c1_s_p9_1, + _vq_quantmap__44c1_s_p9_1, + 13, + 13 + }; + + static static_codebook _44c1_s_p9_1 = { + 2, 169, + _vq_lengthlist__44c1_s_p9_1, + 1, -522616832, 1620115456, 4, 0, + _vq_quantlist__44c1_s_p9_1, + NULL, + &_vq_auxt__44c1_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_s_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c1_s_p9_2[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 8, 9, 8, 9, 9, + 9,10,10,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9,10,10,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9,10,10,11,10, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,11, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10, 9,10,10,10,11,11, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,11,11,11,11, 9, 9, + 9, 9, 9, 9,10, 9,10, 9, 9, 9,10,10,10,11,10, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,11,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10, + 11,11,10, 9, 9,10, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 11,11,11,10, 9,10,10,10, 9, 9, 9, 9,10, 9,10,10, + 10,10,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 11,10,10,10,10,10,10, 9, 9, 9, 9,10, 9, 9, 9, 9, + 10,10,10,11,11,10,10,11,11, 9, 9,10, 9, 9, 9, 9, + 9, + }; + + static float _vq_quantthresh__44c1_s_p9_2[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c1_s_p9_2[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_s_p9_2 = { + _vq_quantthresh__44c1_s_p9_2, + _vq_quantmap__44c1_s_p9_2, + 17, + 17 + }; + + static static_codebook _44c1_s_p9_2 = { + 2, 289, + _vq_lengthlist__44c1_s_p9_2, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c1_s_p9_2, + NULL, + &_vq_auxt__44c1_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c1_s_short[] = { + 5, 7,17,13,12,12,14,16,15,16, 4, 2,17, 5, 7, 6, + 8,11,14,13,16,16,16,16,16,16,16,16,16,16,10, 4, + 16, 4, 8, 6, 7,11,14,14,10, 5,16, 6, 5, 6, 8,12, + 15,15,10, 5,16, 5, 6, 5, 7,10,14,15,11, 6,16, 7, + 8, 7, 7,10,14,14,13, 8,16, 8, 7, 7, 8,10,12,13, + 12, 8,16, 7, 5, 5, 6, 8,11,13,13, 9,16, 9, 6, 6, + 7, 8,10,13, + }; + + static static_codebook _huff_book__44c1_s_short = { + 2, 100, + _huff_lengthlist__44c1_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c1_sm_long[] = { + 3, 4,10, 9,11, 9,10,11,11,13, 4, 2,11, 5, 7, 7, + 8,10,12,13,10,10, 7,12, 8, 9, 9,10,12,13, 8, 5, + 13, 6, 9, 7,10,12,15,15,10, 6, 7, 8, 5, 5, 7,10, + 12,13, 9, 6, 8, 7, 5, 5, 6, 9,11,12, 9, 8, 9, 9, + 6, 5, 5, 7,10,13,10,10,10,12, 9, 7, 6, 7, 9,13, + 10,13,11,17,11,11, 9, 8, 9,12,12,16,14,17,15,14, + 12,10,10,12, + }; + + static static_codebook _huff_book__44c1_sm_long = { + 2, 100, + _huff_lengthlist__44c1_sm_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c1_sm_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9, 9,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_sm_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c1_sm_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p1_0 = { + _vq_quantthresh__44c1_sm_p1_0, + _vq_quantmap__44c1_sm_p1_0, + 3, + 3 + }; + + static static_codebook _44c1_sm_p1_0 = { + 8, 6561, + _vq_lengthlist__44c1_sm_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c1_sm_p1_0, + NULL, + &_vq_auxt__44c1_sm_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c1_sm_p2_0[] = { + 1, 5, 5, 0, 0, 0, 5, 6, 0, 0, 0, 5, 6, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 8, + 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, 0, 8, 8, 0, 0, + 0, 8, 8, 0, 0, 0,10, 9, 0, 0, 0, 0, 0, 0, 0, 6, + 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, + 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8,10,10, 0, 0, 0,10,10, 0, 0, 0, 9,10, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10,10, 0, 0, 0,10, + 10, 0, 0, 0,10, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_sm_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c1_sm_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p2_0 = { + _vq_quantthresh__44c1_sm_p2_0, + _vq_quantmap__44c1_sm_p2_0, + 5, + 5 + }; + + static static_codebook _44c1_sm_p2_0 = { + 4, 625, + _vq_lengthlist__44c1_sm_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c1_sm_p2_0, + NULL, + &_vq_auxt__44c1_sm_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c1_sm_p3_0[] = { + 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 7, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_sm_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c1_sm_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p3_0 = { + _vq_quantthresh__44c1_sm_p3_0, + _vq_quantmap__44c1_sm_p3_0, + 5, + 5 + }; + + static static_codebook _44c1_sm_p3_0 = { + 4, 625, + _vq_lengthlist__44c1_sm_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c1_sm_p3_0, + NULL, + &_vq_auxt__44c1_sm_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c1_sm_p4_0[] = { + 1, 3, 3, 7, 7, 0, 0, 0, 0, 0, 5, 5, 6, 6, 0, 0, + 0, 0, 0, 5, 5, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 9, 0, 0, 0, 0, 0, 0, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c1_sm_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c1_sm_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p4_0 = { + _vq_quantthresh__44c1_sm_p4_0, + _vq_quantmap__44c1_sm_p4_0, + 9, + 9 + }; + + static static_codebook _44c1_sm_p4_0 = { + 2, 81, + _vq_lengthlist__44c1_sm_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c1_sm_p4_0, + NULL, + &_vq_auxt__44c1_sm_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c1_sm_p5_0[] = { + 2, 3, 3, 5, 5, 6, 6, 8, 8, 0, 5, 5, 6, 6, 7, 7, + 9, 9, 0, 5, 5, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, + 7, 7, 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, + 7, 7, 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, + 0, 0, 9, 9, 9, 9,10,10, 0, 0, 0, 0, 0, 8, 8,10, + 10, + }; + + static float _vq_quantthresh__44c1_sm_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c1_sm_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p5_0 = { + _vq_quantthresh__44c1_sm_p5_0, + _vq_quantmap__44c1_sm_p5_0, + 9, + 9 + }; + + static static_codebook _44c1_sm_p5_0 = { + 2, 81, + _vq_lengthlist__44c1_sm_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c1_sm_p5_0, + NULL, + &_vq_auxt__44c1_sm_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c1_sm_p6_0[] = { + 2, 3, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9, + 10,10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, + 9,10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8,10,10, + 10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8, + 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, + 8, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 9, 9,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,10,10,11,11,11,11,13,12,13,13, 0, 0, + 0, 0, 0, 0, 0,10,10,11,11,11,11,13,13,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,11,11,12,12,13,12,14, + 14, + }; + + static float _vq_quantthresh__44c1_sm_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c1_sm_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p6_0 = { + _vq_quantthresh__44c1_sm_p6_0, + _vq_quantmap__44c1_sm_p6_0, + 17, + 17 + }; + + static static_codebook _44c1_sm_p6_0 = { + 2, 289, + _vq_lengthlist__44c1_sm_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c1_sm_p6_0, + NULL, + &_vq_auxt__44c1_sm_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c1_sm_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,10,10,10, 6, 9, 9,10,10,10,10, 9, 9, 6, 9, 9, + 10,10,10,10,10, 9, 7,10,10,11,10,10,11,11,11, 6, + 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10, 9, 9,11,10, + 10, + }; + + static float _vq_quantthresh__44c1_sm_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c1_sm_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p7_0 = { + _vq_quantthresh__44c1_sm_p7_0, + _vq_quantmap__44c1_sm_p7_0, + 3, + 3 + }; + + static static_codebook _44c1_sm_p7_0 = { + 4, 81, + _vq_lengthlist__44c1_sm_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c1_sm_p7_0, + NULL, + &_vq_auxt__44c1_sm_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c1_sm_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 7, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 9, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c1_sm_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c1_sm_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p7_1 = { + _vq_quantthresh__44c1_sm_p7_1, + _vq_quantmap__44c1_sm_p7_1, + 11, + 11 + }; + + static static_codebook _44c1_sm_p7_1 = { + 2, 121, + _vq_lengthlist__44c1_sm_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c1_sm_p7_1, + NULL, + &_vq_auxt__44c1_sm_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c1_sm_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 6, 7, 7, 8, + 8, 8, 8, 9, 9,11,10, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10,10,11,11,12,11, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, + 9, 9,10,10,11,12,12,12, 0, 0, 0,10,10, 9, 9,11, + 11,12,12,13,13, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,10,12,12,13,13, 0, + 0, 0, 0, 0,12,11,11,11,12,12,14,13, 0, 0, 0, 0, + 0,12,12,11,10,12,12,14,13, + }; + + static float _vq_quantthresh__44c1_sm_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c1_sm_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p8_0 = { + _vq_quantthresh__44c1_sm_p8_0, + _vq_quantmap__44c1_sm_p8_0, + 13, + 13 + }; + + static static_codebook _44c1_sm_p8_0 = { + 2, 169, + _vq_lengthlist__44c1_sm_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c1_sm_p8_0, + NULL, + &_vq_auxt__44c1_sm_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c1_sm_p8_1[] = { + 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c1_sm_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c1_sm_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p8_1 = { + _vq_quantthresh__44c1_sm_p8_1, + _vq_quantmap__44c1_sm_p8_1, + 5, + 5 + }; + + static static_codebook _44c1_sm_p8_1 = { + 2, 25, + _vq_lengthlist__44c1_sm_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c1_sm_p8_1, + NULL, + &_vq_auxt__44c1_sm_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c1_sm_p9_0[] = { + 1, 5, 5,11,11,11,11,11,11,11,11,11,11, 4, 5, 5, + 11,10,11,11,11,11,11,11,11,11, 4, 5, 4,11,11,11, + 11,11,11,11,11,11,11,11, 6, 7,11, 9,11,11,11,11, + 11,11,11,11,11, 6, 7, 9, 8,11,11,11,11,11,11,11, + 11,11, 9, 9, 7, 8,11,11,11,11,11,11,11,11,11,10, + 10, 9,10,11,11,11,11,11,11,11,11,11,11,11, 8,11, + 10,10,11,11,11,11,11,11,11,11,11, 9,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11, 9,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,10,10,10,10,10, + }; + + static float _vq_quantthresh__44c1_sm_p9_0[] = { + -1215.5, -994.5, -773.5, -552.5, -331.5, -110.5, 110.5, 331.5, + 552.5, 773.5, 994.5, 1215.5, + }; + + static long _vq_quantmap__44c1_sm_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p9_0 = { + _vq_quantthresh__44c1_sm_p9_0, + _vq_quantmap__44c1_sm_p9_0, + 13, + 13 + }; + + static static_codebook _44c1_sm_p9_0 = { + 2, 169, + _vq_lengthlist__44c1_sm_p9_0, + 1, -514541568, 1627103232, 4, 0, + _vq_quantlist__44c1_sm_p9_0, + NULL, + &_vq_auxt__44c1_sm_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c1_sm_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7,10,10,12,12,13,13, 6, 5, 5, + 7, 7, 8, 8,10,10,12,12,14,13, 6, 5, 5, 7, 7, 8, + 8,10,10,12,12,13,13,16, 7, 7, 7, 7, 9, 9,11,11, + 13,14,13,15,18, 7, 6, 8, 7, 9, 9,11,10,12,12,14, + 12,19,10,10, 8, 8,10,10,12,11,13,15,15,15,17,11, + 11, 8, 7,11,10,12,12,13,13,14,15,16,17,17,10,11, + 10,10,13,13,14,13,16,15,17,17,16,10,10,11,11,14, + 14,16,13,14,14,17,19,17,15,14,11,11,13,13,15,14, + 16,15,17,16,17,14,14,11,11,14,13,14,14,14,15,17, + 16,16,16,17,13,13,13,13,16,14,17,15,16,17,18,18, + 17,13,13,13,13,15,15,16,16, + }; + + static float _vq_quantthresh__44c1_sm_p9_1[] = { + -93.5, -76.5, -59.5, -42.5, -25.5, -8.5, 8.5, 25.5, + 42.5, 59.5, 76.5, 93.5, + }; + + static long _vq_quantmap__44c1_sm_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p9_1 = { + _vq_quantthresh__44c1_sm_p9_1, + _vq_quantmap__44c1_sm_p9_1, + 13, + 13 + }; + + static static_codebook _44c1_sm_p9_1 = { + 2, 169, + _vq_lengthlist__44c1_sm_p9_1, + 1, -522616832, 1620115456, 4, 0, + _vq_quantlist__44c1_sm_p9_1, + NULL, + &_vq_auxt__44c1_sm_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c1_sm_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c1_sm_p9_2[] = { + 2, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9,10, 6, 6, 7, 7, 8, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9,10, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, + 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 7, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10, 9,10,10,10, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11,11, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9,10, 9,10,11,10,11,11, 9, 9, + 9, 9, 9, 9, 9,10,10, 9, 9, 9,10,11,10,11,11, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10,11,10,11, + 11,10,11, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, + 11,11,11,11, 9,10,10,10, 9, 9, 9, 9,10, 9,10,10, + 10,11,11,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9,10, + 11,10,11,10,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,11,11,10,10,10,11, 9, 9, 9, 9, 9, 9, 9, + 9, + }; + + static float _vq_quantthresh__44c1_sm_p9_2[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c1_sm_p9_2[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c1_sm_p9_2 = { + _vq_quantthresh__44c1_sm_p9_2, + _vq_quantmap__44c1_sm_p9_2, + 17, + 17 + }; + + static static_codebook _44c1_sm_p9_2 = { + 2, 289, + _vq_lengthlist__44c1_sm_p9_2, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c1_sm_p9_2, + NULL, + &_vq_auxt__44c1_sm_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c1_sm_short[] = { + 4, 7,13,13,13,13,14,16,16,19, 4, 2,13, 5, 8, 7, + 9,12,14,13,16, 9,10,10, 9,10,11,13,17,19, 9, 4, + 13, 5,10, 6, 8,11,15,15,11, 6, 9, 7, 6, 6, 8,11, + 14,18,11, 5, 9, 6, 6, 5, 6, 9,13,15,12, 6, 9, 7, + 6, 5, 5, 8,12,15,13, 7,10, 8, 6, 6, 7, 9,12,13, + 13, 9,11, 9, 6, 5, 6, 8,11,13,13,11,13,11, 7, 6, + 7, 8,10,12, + }; + + static static_codebook _huff_book__44c1_sm_short = { + 2, 100, + _huff_lengthlist__44c1_sm_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c2_s_long[] = { + 5, 5,12,10,11,10,10,10,11,13, 5, 1, 9, 5, 8, 7, + 8,10,13,13,12, 9, 8,11, 7, 8, 9,11,13,15, 9, 5, + 12, 6, 9, 8,10,12,15,14,12, 7, 6, 8, 5, 6, 7,10, + 12,13,10, 7, 8, 7, 6, 6, 7, 9,12,12,10, 8, 9, 9, + 7, 6, 6, 7,10,11,10, 9,10,11, 9, 8, 6, 6, 8,11, + 10,12,13,15,11,10, 8, 7, 8,11,11,13,16,16,14,13, + 11, 9, 9,10, + }; + + static static_codebook _huff_book__44c2_s_long = { + 2, 100, + _huff_lengthlist__44c2_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c2_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, + 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c2_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c2_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p1_0 = { + _vq_quantthresh__44c2_s_p1_0, + _vq_quantmap__44c2_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c2_s_p1_0 = { + 8, 6561, + _vq_lengthlist__44c2_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c2_s_p1_0, + NULL, + &_vq_auxt__44c2_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c2_s_p2_0[] = { + 1, 4, 4, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 4, 6, 6, 0, 0, 0, 8, + 8, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 4, 6, 6, 0, 0, 0, 8, 9, 0, 0, 0, 8, 8, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0,11,10, 0, 0, + 0,11,11, 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 7, + 8, 8, 0, 0, 0,10,11, 0, 0, 0,11,11, 0, 0, 0,11, + 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 8, 8, 0, 0, 0,11,11, 0, 0, 0,11,11, + 0, 0, 0,11,11, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, + 0, 0,11,11, 0, 0, 0,11,11, 0, 0, 0,11,11, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 9, 9, 0, 0, 0,11,12, 0, 0, 0,11,12, 0, 0, 0, + 12,11, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0,12, + 11, 0, 0, 0,11,11, 0, 0, 0,11,11, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c2_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c2_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p2_0 = { + _vq_quantthresh__44c2_s_p2_0, + _vq_quantmap__44c2_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c2_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c2_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c2_s_p2_0, + NULL, + &_vq_auxt__44c2_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c2_s_p3_0[] = { + 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c2_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c2_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p3_0 = { + _vq_quantthresh__44c2_s_p3_0, + _vq_quantmap__44c2_s_p3_0, + 5, + 5 + }; + + static static_codebook _44c2_s_p3_0 = { + 4, 625, + _vq_lengthlist__44c2_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c2_s_p3_0, + NULL, + &_vq_auxt__44c2_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c2_s_p4_0[] = { + 1, 3, 3, 6, 6, 0, 0, 0, 0, 0, 6, 6, 6, 6, 0, 0, + 0, 0, 0, 6, 6, 6, 6, 0, 0, 0, 0, 0, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c2_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c2_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p4_0 = { + _vq_quantthresh__44c2_s_p4_0, + _vq_quantmap__44c2_s_p4_0, + 9, + 9 + }; + + static static_codebook _44c2_s_p4_0 = { + 2, 81, + _vq_lengthlist__44c2_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c2_s_p4_0, + NULL, + &_vq_auxt__44c2_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c2_s_p5_0[] = { + 1, 3, 3, 6, 6, 6, 6, 8, 8, 0, 7, 7, 7, 7, 8, 8, + 9, 9, 0, 7, 7, 7, 7, 8, 8, 9, 9, 0, 7, 7, 8, 7, + 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, 0, 0, + 8, 8, 9, 9,10,10, 0, 0, 0, 8, 8, 9, 9,10,10, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, + }; + + static float _vq_quantthresh__44c2_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c2_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p5_0 = { + _vq_quantthresh__44c2_s_p5_0, + _vq_quantmap__44c2_s_p5_0, + 9, + 9 + }; + + static static_codebook _44c2_s_p5_0 = { + 2, 81, + _vq_lengthlist__44c2_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c2_s_p5_0, + NULL, + &_vq_auxt__44c2_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c2_s_p6_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10,10, + 11,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10,10, + 10,11,11, 0, 7, 7, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,11,11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9, 9, 9, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 9, 9, 9, 9, 9, + 9,10,11,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,11,12,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, 9, + 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 9, + 9, 9, 9,10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, + 10,10,10,10,10,11,11,11,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,12,12,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,11,12,12,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,11,11,12,12,13,12,14,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,11,11,12,12,12,13,13, + 14, + }; + + static float _vq_quantthresh__44c2_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c2_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p6_0 = { + _vq_quantthresh__44c2_s_p6_0, + _vq_quantmap__44c2_s_p6_0, + 17, + 17 + }; + + static static_codebook _44c2_s_p6_0 = { + 2, 289, + _vq_lengthlist__44c2_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c2_s_p6_0, + NULL, + &_vq_auxt__44c2_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c2_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10, 9,10,10, + 10,11,10,10, 6, 9, 9,10,10,10,11, 9, 9, 6, 9, 9, + 10,10,10,11, 9, 9, 7,10,10,11,10,10,11,11,10, 6, + 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10, 9,10,11,10, + 10, + }; + + static float _vq_quantthresh__44c2_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c2_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p7_0 = { + _vq_quantthresh__44c2_s_p7_0, + _vq_quantmap__44c2_s_p7_0, + 3, + 3 + }; + + static static_codebook _44c2_s_p7_0 = { + 4, 81, + _vq_lengthlist__44c2_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c2_s_p7_0, + NULL, + &_vq_auxt__44c2_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c2_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 7, 7, 7, 7,10, 6, 6, 6, 6, + 7, 7, 8, 7, 8, 8, 9, 6, 6, 6, 6, 7, 7, 7, 7, 7, + 7,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,10, 9, 9, 6, + 6, 7, 7, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10, 9, 8, 8, 8, + 8, 8, 8,10,10,10, 9,10, 8, 8, 8, 8, 8, 8,10,10, + 10,10, 9, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c2_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c2_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p7_1 = { + _vq_quantthresh__44c2_s_p7_1, + _vq_quantmap__44c2_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c2_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c2_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c2_s_p7_1, + NULL, + &_vq_auxt__44c2_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c2_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 9, 8, 9, 9,10,10, 7, 5, 5, 7, 7, 8, + 8, 8, 9,10, 9,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9,10,10,10,11, + 11, 0,12,12, 9, 9,10,10,10,10,11,11,12,12, 0,13, + 12, 9, 9,10, 9,10,10,11,11,11,12, 0, 0, 0,10,10, + 10,10,11,11,11,11,12,12, 0, 0, 0,10,10, 9, 9,11, + 11,12,12,12,13, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,12,12,11,12,12,12,14,13, 0, 0, 0, 0, + 0,12,12,12,12,12,12,14,13, + }; + + static float _vq_quantthresh__44c2_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c2_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p8_0 = { + _vq_quantthresh__44c2_s_p8_0, + _vq_quantmap__44c2_s_p8_0, + 13, + 13 + }; + + static static_codebook _44c2_s_p8_0 = { + 2, 169, + _vq_lengthlist__44c2_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c2_s_p8_0, + NULL, + &_vq_auxt__44c2_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c2_s_p8_1[] = { + 2, 4, 4, 4, 5, 6, 5, 5, 5, 5, 6, 5, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c2_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c2_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p8_1 = { + _vq_quantthresh__44c2_s_p8_1, + _vq_quantmap__44c2_s_p8_1, + 5, + 5 + }; + + static static_codebook _44c2_s_p8_1 = { + 2, 25, + _vq_lengthlist__44c2_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c2_s_p8_1, + NULL, + &_vq_auxt__44c2_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c2_s_p9_0[] = { + 1, 5, 4,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 5, 7, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 6, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + }; + + static float _vq_quantthresh__44c2_s_p9_0[] = { + -1215.5, -994.5, -773.5, -552.5, -331.5, -110.5, 110.5, 331.5, + 552.5, 773.5, 994.5, 1215.5, + }; + + static long _vq_quantmap__44c2_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p9_0 = { + _vq_quantthresh__44c2_s_p9_0, + _vq_quantmap__44c2_s_p9_0, + 13, + 13 + }; + + static static_codebook _44c2_s_p9_0 = { + 2, 169, + _vq_lengthlist__44c2_s_p9_0, + 1, -514541568, 1627103232, 4, 0, + _vq_quantlist__44c2_s_p9_0, + NULL, + &_vq_auxt__44c2_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c2_s_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,11,11,12,12, 6, 5, 5, + 7, 7, 8, 8,10,10,12,11,13,13, 6, 5, 5, 7, 7, 8, + 8, 9, 9,11,11,12,13,16, 7, 7, 8, 8, 9, 9,10,10, + 13,13,16,14,16, 7, 7, 8, 8, 9, 9,10,10,13,13,15, + 13,16,10,10, 8, 8,10,10,11,11,12,12,15,14,16,11, + 11, 8, 8,10,10,11,11,12,12,14,13,16,16,16,10,11, + 10,10,12,12,14,13,13,13,16,16,16,10, 9,10, 7,13, + 12,13,13,13,13,16,16,16,14,15,11,11,12,12,13,13, + 15,14,16,16,16,16,14,11, 9,12, 9,15,13,13,14,16, + 16,16,16,16,13,13,12,12,14,15,16,15,16,16,15,16, + 16,13,12,12,11,15,13,14,15, + }; + + static float _vq_quantthresh__44c2_s_p9_1[] = { + -93.5, -76.5, -59.5, -42.5, -25.5, -8.5, 8.5, 25.5, + 42.5, 59.5, 76.5, 93.5, + }; + + static long _vq_quantmap__44c2_s_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p9_1 = { + _vq_quantthresh__44c2_s_p9_1, + _vq_quantmap__44c2_s_p9_1, + 13, + 13 + }; + + static static_codebook _44c2_s_p9_1 = { + 2, 169, + _vq_lengthlist__44c2_s_p9_1, + 1, -522616832, 1620115456, 4, 0, + _vq_quantlist__44c2_s_p9_1, + NULL, + &_vq_auxt__44c2_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c2_s_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c2_s_p9_2[] = { + 2, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, + 9,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 9, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,11,10, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 7, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,11,11, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,11,11,10,11,10, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,10, 9, + 9, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10,11,11, + 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,11,10,10,11, + 10,10,11, 9, 9,10,10, 9, 9,10,10, 9, 9,10,10,10, + 11,10,11,10,10, 9, 9,10, 9, 9, 9, 9, 9, 9,10,10, + 10,10,11,10,10, 9,10, 9, 9, 9, 9,10, 9, 9, 9,10, + 10,10,11,11,10,10,10,10, 9, 9,10, 9, 9, 9,10, 9, + 10,10,10,10,11,10,11,11,10, 9, 9, 9, 9, 9, 9, 9, + 10, + }; + + static float _vq_quantthresh__44c2_s_p9_2[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c2_s_p9_2[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c2_s_p9_2 = { + _vq_quantthresh__44c2_s_p9_2, + _vq_quantmap__44c2_s_p9_2, + 17, + 17 + }; + + static static_codebook _44c2_s_p9_2 = { + 2, 289, + _vq_lengthlist__44c2_s_p9_2, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c2_s_p9_2, + NULL, + &_vq_auxt__44c2_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c2_s_short[] = { + 9, 9,12,11,11,11,12,12,12,13, 6, 2, 9, 4, 7, 6, + 8,11,15,17,12, 7, 8, 9, 7, 9,10,13,15,17,11, 4, + 12, 4, 9, 5, 8,11,16,17,12, 6, 7, 6, 6, 6, 8,11, + 15,17,11, 5, 9, 5, 6, 5, 6,10,15,15,12, 7,11, 7, + 7, 6, 7,10,13,16,13, 8,11, 9, 8, 6, 7,10,12,16, + 13, 9, 9, 8, 5, 5, 6, 9,12,14,16,10, 9, 9, 6, 5, + 6, 8,11,14, + }; + + static static_codebook _huff_book__44c2_s_short = { + 2, 100, + _huff_lengthlist__44c2_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c3_s_long[] = { + 4, 5,11,10,12,10,10,10,11,12, 4, 2,11, 5,11, 6, + 7, 9,13,16,11,11, 7,11, 6, 8, 8, 9,11,12,10, 5, + 11, 6,10, 7, 9,11,16,16,14, 9, 6, 9, 4, 5, 7, 8, + 11,13,10, 6, 7, 7, 5, 5, 6, 8,10,11,10, 7, 8, 8, + 6, 6, 5, 7, 9,10,10, 9, 8,11, 8, 7, 6, 6, 7,10, + 10,12,10,14, 9, 9, 7, 7, 7, 9,10,14,11,16,12,12, + 9, 8, 8, 9, + }; + + static static_codebook _huff_book__44c3_s_long = { + 2, 100, + _huff_lengthlist__44c3_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c3_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8, 9, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, + 0, 0, 0, 0, 0, 8, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c3_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c3_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p1_0 = { + _vq_quantthresh__44c3_s_p1_0, + _vq_quantmap__44c3_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c3_s_p1_0 = { + 8, 6561, + _vq_lengthlist__44c3_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c3_s_p1_0, + NULL, + &_vq_auxt__44c3_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c3_s_p2_0[] = { + 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, + 8, 7, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 8, + 7, 0, 0, 0, 7, 7, 0, 0, 0,10, 9, 0, 0, 0, 0, 0, + 0, 0, 5, 5, 6, 0, 0, 0, 7, 8, 0, 0, 0, 7, 7, 0, + 0, 0, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, + 0, 7, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, + 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 8, 0, + 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 8, 9,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 9, + 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c3_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c3_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p2_0 = { + _vq_quantthresh__44c3_s_p2_0, + _vq_quantmap__44c3_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c3_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c3_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c3_s_p2_0, + NULL, + &_vq_auxt__44c3_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c3_s_p3_0[] = { + 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c3_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c3_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p3_0 = { + _vq_quantthresh__44c3_s_p3_0, + _vq_quantmap__44c3_s_p3_0, + 5, + 5 + }; + + static static_codebook _44c3_s_p3_0 = { + 4, 625, + _vq_lengthlist__44c3_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c3_s_p3_0, + NULL, + &_vq_auxt__44c3_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c3_s_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 8, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c3_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c3_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p4_0 = { + _vq_quantthresh__44c3_s_p4_0, + _vq_quantmap__44c3_s_p4_0, + 9, + 9 + }; + + static static_codebook _44c3_s_p4_0 = { + 2, 81, + _vq_lengthlist__44c3_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c3_s_p4_0, + NULL, + &_vq_auxt__44c3_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c3_s_p5_0[] = { + 2, 3, 3, 5, 5, 7, 7, 9, 8, 0, 4, 4, 7, 7, 7, 7, + 9, 9, 0, 5, 5, 6, 7, 7, 7, 9, 9, 0, 6, 6, 7, 7, + 7, 7, 9, 9, 0, 0, 0, 7, 7, 7, 7, 9, 9, 0, 0, 0, + 8, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, + }; + + static float _vq_quantthresh__44c3_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c3_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p5_0 = { + _vq_quantthresh__44c3_s_p5_0, + _vq_quantmap__44c3_s_p5_0, + 9, + 9 + }; + + static static_codebook _44c3_s_p5_0 = { + 2, 81, + _vq_lengthlist__44c3_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c3_s_p5_0, + NULL, + &_vq_auxt__44c3_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c3_s_p6_0[] = { + 2, 3, 3, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 11,11, 0, 5, 5, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,11,11, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, 9, + 10,10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, + 9,10,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,12,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, 8, + 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, + 8, 9, 9,10,10,11,11,12,12,13,12, 0, 0, 0, 0, 0, + 9, 9,10,10,11,10,11,11,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,10,10,11,11,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,10,10,11,11,12,12,12,12,13,13, 0, 0, + 0, 0, 0, 0, 0,10,10,11,11,11,11,12,12,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,12,13,13,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13, + 13, + }; + + static float _vq_quantthresh__44c3_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c3_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p6_0 = { + _vq_quantthresh__44c3_s_p6_0, + _vq_quantmap__44c3_s_p6_0, + 17, + 17 + }; + + static static_codebook _44c3_s_p6_0 = { + 2, 289, + _vq_lengthlist__44c3_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c3_s_p6_0, + NULL, + &_vq_auxt__44c3_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c3_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10,10,10,10, 9, 9, 6, 9, 9, + 10,10,10,10, 9, 9, 7,10,10,10,11,11,11,10,11, 6, + 9, 9,10,10, 9,11,10,10, 6, 9, 9,10, 9, 9,10,10, + 10, + }; + + static float _vq_quantthresh__44c3_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c3_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p7_0 = { + _vq_quantthresh__44c3_s_p7_0, + _vq_quantmap__44c3_s_p7_0, + 3, + 3 + }; + + static static_codebook _44c3_s_p7_0 = { + 4, 81, + _vq_lengthlist__44c3_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c3_s_p7_0, + NULL, + &_vq_auxt__44c3_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c3_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 9, + }; + + static float _vq_quantthresh__44c3_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c3_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p7_1 = { + _vq_quantthresh__44c3_s_p7_1, + _vq_quantmap__44c3_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c3_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c3_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c3_s_p7_1, + NULL, + &_vq_auxt__44c3_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c3_s_p8_0[] = { + 1, 4, 4, 6, 6, 7, 8, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 9, 9, 9, 9,10,10, 7, 5, 5, 7, 7, 8, + 8, 9, 9, 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,11,12, 9, 9, 9,10,10,10,11,11,11,12, 0,13, + 13, 9, 9, 9, 9,10,10,11,11,12,12, 0, 0, 0,10, 9, + 9, 9,10,11,11,11,12,12, 0, 0, 0,10,10, 9, 9,11, + 11,11,11,12,13, 0, 0, 0,13,13,10,10,11,11,12,12, + 13,13, 0, 0, 0,14,14,10,10,11,11,12,12,13,13, 0, + 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,11,12,12,13,13, + }; + + static float _vq_quantthresh__44c3_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c3_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p8_0 = { + _vq_quantthresh__44c3_s_p8_0, + _vq_quantmap__44c3_s_p8_0, + 13, + 13 + }; + + static static_codebook _44c3_s_p8_0 = { + 2, 169, + _vq_lengthlist__44c3_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c3_s_p8_0, + NULL, + &_vq_auxt__44c3_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c3_s_p8_1[] = { + 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c3_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c3_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p8_1 = { + _vq_quantthresh__44c3_s_p8_1, + _vq_quantmap__44c3_s_p8_1, + 5, + 5 + }; + + static static_codebook _44c3_s_p8_1 = { + 2, 25, + _vq_lengthlist__44c3_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c3_s_p8_1, + NULL, + &_vq_auxt__44c3_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c3_s_p9_0[] = { + 1, 4, 4,10,10,10,10,10,10,10,10,10,10, 5,10, 7, + 10,10,10,10,10,10,10,10,10,10, 5, 8, 6,10,10,10, + 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + }; + + static float _vq_quantthresh__44c3_s_p9_0[] = { + -1402.5, -1147.5, -892.5, -637.5, -382.5, -127.5, 127.5, 382.5, + 637.5, 892.5, 1147.5, 1402.5, + }; + + static long _vq_quantmap__44c3_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p9_0 = { + _vq_quantthresh__44c3_s_p9_0, + _vq_quantmap__44c3_s_p9_0, + 13, + 13 + }; + + static static_codebook _44c3_s_p9_0 = { + 2, 169, + _vq_lengthlist__44c3_s_p9_0, + 1, -514332672, 1627381760, 4, 0, + _vq_quantlist__44c3_s_p9_0, + NULL, + &_vq_auxt__44c3_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c3_s_p9_1[] = { + 1, 4, 4, 6, 6, 7, 7, 9, 9,11,11,11,12,12,12, 6, + 5, 5, 7, 7, 8, 8,10, 9,11,11,13,12,13,14, 6, 5, + 5, 7, 7, 8, 8,10,10,11,11,12,12,13,13,17, 7, 7, + 8, 8, 9, 9,10,10,12,12,14,13,14,14,17, 8, 7, 8, + 7, 9, 9,10,10,12,12,13,13,13,14,17,11,11, 8, 8, + 10,10,11,11,12,12,13,13,15,14,17,11,11, 8, 7,10, + 10,11,11,12,12,13,14,14,13,17,17,17,10,11,10,10, + 12,12,13,12,13,13,14,14,17,16,16,10,10,11, 9,13, + 12,13,13,13,13,14,14,16,16,15,13,15,11,12,12,12, + 14,14,14,14,14,15,16,16,16,14,14,11, 9,12,10,13, + 13,14,14,14,14,16,16,16,16,16,12,13,12,12,13,14, + 14,14,15,15,15,16,16,15,16,13,11,13,10,14,12,15, + 14,16,14,15,16,16,16,16,15,15,13,13,13,13,14,14, + 16,16,16,16,16,15,16,16,14,13,12,13,13,14,16,16, + 16, + }; + + static float _vq_quantthresh__44c3_s_p9_1[] = { + -110.5, -93.5, -76.5, -59.5, -42.5, -25.5, -8.5, 8.5, + 25.5, 42.5, 59.5, 76.5, 93.5, 110.5, + }; + + static long _vq_quantmap__44c3_s_p9_1[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p9_1 = { + _vq_quantthresh__44c3_s_p9_1, + _vq_quantmap__44c3_s_p9_1, + 15, + 15 + }; + + static static_codebook _44c3_s_p9_1 = { + 2, 225, + _vq_lengthlist__44c3_s_p9_1, + 1, -522338304, 1620115456, 4, 0, + _vq_quantlist__44c3_s_p9_1, + NULL, + &_vq_auxt__44c3_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c3_s_p9_2[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c3_s_p9_2[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, + 8,10, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9,10, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9,10, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9,10,10,10, 8, 7, 8, 8, 9, 8, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,10, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,11, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,11,10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,11, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 11,10,11,10, 9, 9, 9,10, 9, 9, 9, 9, 9, 9,10,10, + 10,10,11,11,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9,10, 9, + 10,10,10,10,11,10,11,10,10, 9, 9, 9, 9, 9, 9, 9, + 9, + }; + + static float _vq_quantthresh__44c3_s_p9_2[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c3_s_p9_2[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c3_s_p9_2 = { + _vq_quantthresh__44c3_s_p9_2, + _vq_quantmap__44c3_s_p9_2, + 17, + 17 + }; + + static static_codebook _44c3_s_p9_2 = { + 2, 289, + _vq_lengthlist__44c3_s_p9_2, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c3_s_p9_2, + NULL, + &_vq_auxt__44c3_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c3_s_short[] = { + 10,10,13,12,13,12,12,12,12,13, 8, 3,11, 5,10, 5, + 7,11,14,16,11, 6, 9, 8, 7, 7, 9,12,15,16,12, 4, + 12, 4,10, 5, 8,12,15,16,12, 6, 8, 7, 5, 5, 7,11, + 14,15,11, 4, 9, 4, 6, 4, 6, 9,13,15,10, 6,10, 7, + 7, 5, 6, 9,13,15,12, 9,11, 9, 8, 6, 7, 9,12,15, + 13,11,10, 9, 6, 5, 5, 8,11,14,16,12,11,10, 6, 5, + 6, 8,10,14, + }; + + static static_codebook _huff_book__44c3_s_short = { + 2, 100, + _huff_lengthlist__44c3_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c4_s_long[] = { + 3, 5,11,11,13,11,11,11,12,12, 5, 2,11, 6,10, 7, + 8,10,13,16,10, 9, 6,10, 6, 7, 8, 9,11,12,11, 5, + 11, 7,10, 8,10,12,15,17,12, 8, 5, 9, 4, 5, 7, 8, + 10,12,10, 6, 7, 8, 5, 5, 6, 8,10,11,10, 8, 8, 9, + 6, 6, 6, 7, 9,10,11,10, 9,11, 8, 7, 6, 6, 7, 9, + 11,13,10,15, 9, 9, 7, 7, 7, 8,10,15,11,17,11,11, + 9, 8, 7, 8, + }; + + static static_codebook _huff_book__44c4_s_long = { + 2, 100, + _huff_lengthlist__44c4_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c4_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 5, 7, 6, 0, 0, 0, 0, + 0, 0, 5, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, + 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, + 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 8, 8, 0, 0, + 0, 0, 0, 0, 8,10, 8, 0, 0, 0, 0, 0, 0, 8, 9,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 8, 8, 0, 0, + 0, 0, 0, 0, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 8, 0, 0, 0, 0, 0, 0, 8,10, 9, 0, + 0, 0, 0, 0, 0, 8, 8,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, + 0, 0, 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c4_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c4_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p1_0 = { + _vq_quantthresh__44c4_s_p1_0, + _vq_quantmap__44c4_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c4_s_p1_0 = { + 8, 6561, + _vq_lengthlist__44c4_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c4_s_p1_0, + NULL, + &_vq_auxt__44c4_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c4_s_p2_0[] = { + 2, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, 5, 5, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 5, 6, 6, 0, 0, 0, 8, + 7, 0, 0, 0, 7, 7, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 5, 6, 6, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 7, 7, 0, 0, + 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, + 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 7, 0, 0, 0, 7, 7, 0, 0, 0, 7, 7, + 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 5, 7, 8, 0, + 0, 0, 7, 7, 0, 0, 0, 7, 7, 0, 0, 0, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10,10, 0, 0, 0, 9, 9, 0, 0, 0, 9, 9, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 7,10,10, 0, 0, 0, 9, + 9, 0, 0, 0, 9, 9, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c4_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c4_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p2_0 = { + _vq_quantthresh__44c4_s_p2_0, + _vq_quantmap__44c4_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c4_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c4_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c4_s_p2_0, + NULL, + &_vq_auxt__44c4_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c4_s_p3_0[] = { + 2, 3, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c4_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c4_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p3_0 = { + _vq_quantthresh__44c4_s_p3_0, + _vq_quantmap__44c4_s_p3_0, + 5, + 5 + }; + + static static_codebook _44c4_s_p3_0 = { + 4, 625, + _vq_lengthlist__44c4_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c4_s_p3_0, + NULL, + &_vq_auxt__44c4_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c4_s_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 7, 8, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c4_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c4_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p4_0 = { + _vq_quantthresh__44c4_s_p4_0, + _vq_quantmap__44c4_s_p4_0, + 9, + 9 + }; + + static static_codebook _44c4_s_p4_0 = { + 2, 81, + _vq_lengthlist__44c4_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c4_s_p4_0, + NULL, + &_vq_auxt__44c4_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c4_s_p5_0[] = { + 2, 3, 3, 6, 6, 7, 7, 9, 9, 0, 4, 4, 7, 7, 7, 7, + 9, 9, 0, 4, 4, 7, 7, 7, 7, 9, 9, 0, 6, 6, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 8, 8, 8, 8,10,10, 0, 0, 0, 8, 8, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,11,11, 0, 0, 0, 0, 0, 9, 9,11, + 11, + }; + + static float _vq_quantthresh__44c4_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c4_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p5_0 = { + _vq_quantthresh__44c4_s_p5_0, + _vq_quantmap__44c4_s_p5_0, + 9, + 9 + }; + + static static_codebook _44c4_s_p5_0 = { + 2, 81, + _vq_lengthlist__44c4_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c4_s_p5_0, + NULL, + &_vq_auxt__44c4_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c4_s_p6_0[] = { + 2, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10, 9,10,10,11, + 11, 0, 4, 4, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 11,11, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 6, 6, 7, 7, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, 9, + 10,11,11,11,12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9,10, + 10,11,10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10, + 10,10,11,11,11,11,12,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,11,12,12, 0, 0, 0, 0, 0, 8, 8, + 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, 8, + 8, 9, 9,10,10,11,11,12,12,12,12, 0, 0, 0, 0, 0, + 9, 9,10,10,11,10,11,11,12,12,12,12, 0, 0, 0, 0, + 0, 0, 0,10,10,10,10,11,11,12,12,13,12, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,11,12,12,12,13,12, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,11,11,12,12,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,12,12,13,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13, + 13, + }; + + static float _vq_quantthresh__44c4_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c4_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p6_0 = { + _vq_quantthresh__44c4_s_p6_0, + _vq_quantmap__44c4_s_p6_0, + 17, + 17 + }; + + static static_codebook _44c4_s_p6_0 = { + 2, 289, + _vq_lengthlist__44c4_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c4_s_p6_0, + NULL, + &_vq_auxt__44c4_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c4_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10,10,10,10,10, 9, 6, 9, 9, + 10, 9,10,11, 9, 9, 7,10,10,11,11,11,11,10,10, 6, + 9, 9,10, 9, 9,10,10, 9, 6, 9, 9,10,10,10,10,10, + 10, + }; + + static float _vq_quantthresh__44c4_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c4_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p7_0 = { + _vq_quantthresh__44c4_s_p7_0, + _vq_quantmap__44c4_s_p7_0, + 3, + 3 + }; + + static static_codebook _44c4_s_p7_0 = { + 4, 81, + _vq_lengthlist__44c4_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c4_s_p7_0, + NULL, + &_vq_auxt__44c4_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c4_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 8, 9,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c4_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c4_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p7_1 = { + _vq_quantthresh__44c4_s_p7_1, + _vq_quantmap__44c4_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c4_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c4_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c4_s_p7_1, + NULL, + &_vq_auxt__44c4_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c4_s_p8_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 9, 9,10,10,11,11, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10,10,10,10,11,11, 0,12, + 12, 9, 8, 9, 9,10,10,11,11,12,11, 0, 0, 0, 9,10, + 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 9,10, + 10,11,11,12,12, 0, 0, 0,13,13,10,10,10,11,12,12, + 12,12, 0, 0, 0,14,14,10,10,11,11,11,11,12,12, 0, + 0, 0, 0, 0,11,12,11,11,12,12,12,13, 0, 0, 0, 0, + 0,12,12,11,11,12,12,13,13, + }; + + static float _vq_quantthresh__44c4_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c4_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p8_0 = { + _vq_quantthresh__44c4_s_p8_0, + _vq_quantmap__44c4_s_p8_0, + 13, + 13 + }; + + static static_codebook _44c4_s_p8_0 = { + 2, 169, + _vq_lengthlist__44c4_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c4_s_p8_0, + NULL, + &_vq_auxt__44c4_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c4_s_p8_1[] = { + 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c4_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c4_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p8_1 = { + _vq_quantthresh__44c4_s_p8_1, + _vq_quantmap__44c4_s_p8_1, + 5, + 5 + }; + + static static_codebook _44c4_s_p8_1 = { + 2, 25, + _vq_lengthlist__44c4_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c4_s_p8_1, + NULL, + &_vq_auxt__44c4_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c4_s_p9_0[] = { + 1, 3, 3,10,10,10,10,10,10,10,10,10,10, 5, 7, 7, + 10,10,10,10,10,10,10,10,10,10, 5, 7, 8,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9, 9, 9, + }; + + static float _vq_quantthresh__44c4_s_p9_0[] = { + -1732.5, -1417.5, -1102.5, -787.5, -472.5, -157.5, 157.5, 472.5, + 787.5, 1102.5, 1417.5, 1732.5, + }; + + static long _vq_quantmap__44c4_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p9_0 = { + _vq_quantthresh__44c4_s_p9_0, + _vq_quantmap__44c4_s_p9_0, + 13, + 13 + }; + + static static_codebook _44c4_s_p9_0 = { + 2, 169, + _vq_lengthlist__44c4_s_p9_0, + 1, -513964032, 1628680192, 4, 0, + _vq_quantlist__44c4_s_p9_0, + NULL, + &_vq_auxt__44c4_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c4_s_p9_1[] = { + 1, 4, 4, 5, 6, 7, 7, 9, 9,11,11,12,12,12,13, 6, + 5, 5, 6, 7, 8, 8,10,10,11,11,13,13,13,13, 6, 5, + 5, 7, 7, 8, 8,11,10,11,11,12,13,12,13,17, 7, 7, + 8, 8, 9, 9,11,11,12,12,12,13,15,14,17, 7, 7, 8, + 8, 9, 9,11,10,12,12,13,13,14,13,17,11,12, 9, 9, + 10,10,12,12,13,13,14,14,14,14,17,12,11, 9, 8,11, + 10,11,12,13,13,13,14,14,14,17,17,17,11,11,11,11, + 13,13,13,13,14,13,15,14,17,17,17,11,10,11, 9,13, + 12,13,14,15,14,15,14,17,17,17,14,14,11,12,12,13, + 14,14,16,15,15,15,17,17,17,15,15,12,11,13,11,13, + 13,13,15,16,14,17,17,17,17,17,13,13,14,13,14,14, + 15,15,16,15,17,17,17,17,17,14,14,14,12,14,12,16, + 14,15,14,17,17,17,17,17,16,17,13,14,14,15,15,15, + 17,15,17,17,17,17,17,16,17,13,14,14,14,15,17,15, + 15, + }; + + static float _vq_quantthresh__44c4_s_p9_1[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__44c4_s_p9_1[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p9_1 = { + _vq_quantthresh__44c4_s_p9_1, + _vq_quantmap__44c4_s_p9_1, + 15, + 15 + }; + + static static_codebook _44c4_s_p9_1 = { + 2, 225, + _vq_lengthlist__44c4_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__44c4_s_p9_1, + NULL, + &_vq_auxt__44c4_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c4_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__44c4_s_p9_2[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9,11, 5, 5, 7, 7, 7, 7, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,11, 5, 5, 7, 7, 7, + 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10, 9,10,10,10, + 10,10,10,11,11,11, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,11,11,11,11,11, 8, 8, 9, + 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,11,11,11, + 11,11, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11, + 11,11,11, 9, 9, 9,10,10,10,10,10,10,10,10,10,10, + 10,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,11,11,11,11,11,11,11,10,10, 9, + 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, + 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 12,11,11,10,10,10,10,10,10,10,10,10,10,10,10,12, + 11,12,12,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, + }; + + static float _vq_quantthresh__44c4_s_p9_2[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__44c4_s_p9_2[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__44c4_s_p9_2 = { + _vq_quantthresh__44c4_s_p9_2, + _vq_quantmap__44c4_s_p9_2, + 21, + 21 + }; + + static static_codebook _44c4_s_p9_2 = { + 2, 441, + _vq_lengthlist__44c4_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__44c4_s_p9_2, + NULL, + &_vq_auxt__44c4_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c4_s_short[] = { + 4, 9,13,12,16,11,12,15,15,16, 4, 2,11, 5,10, 6, + 8,11,14,14,13,11, 8,11, 7, 8,10,13,17,17,10, 4, + 11, 5, 9, 6, 9,13,17,17,13, 9, 6, 9, 5, 5, 7,11, + 15,17,10, 5, 7, 6, 5, 4, 7,10,15,15,10, 7, 9, 8, + 7, 6, 7,10,14,13,13,10,11,10, 8, 7, 8,10,14,14, + 12,11,10, 9, 6, 5, 6, 9,13,17,14,13,11,10, 6, 6, + 6, 8,11,16, + }; + + static static_codebook _huff_book__44c4_s_short = { + 2, 100, + _huff_lengthlist__44c4_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c5_s_long[] = { + 3, 6, 9,14,11,13,12,12,12,12, 6, 3, 5, 8, 6, 8, + 10,11,12,14, 9, 5, 4,10, 5, 7, 8, 9,11,12,13, 8, + 10, 9, 9, 9,12,15,16,17,10, 6, 5, 9, 3, 5, 6, 8, + 10,12,10, 8, 7, 9, 5, 5, 6, 8,10,11,10, 9, 8,11, + 6, 6, 6, 7, 8,10,12,11, 9,13, 8, 7, 6, 6, 7, 9, + 11,13,10,15, 9, 9, 7, 7, 7, 8,10,15,10,17,11,10, + 9, 8, 7, 7, + }; + + static static_codebook _huff_book__44c5_s_long = { + 2, 100, + _huff_lengthlist__44c5_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c5_s_p1_0[] = { + 2, 4, 4, 0, 0, 0, 0, 0, 0, 4, 7, 6, 0, 0, 0, 0, + 0, 0, 4, 6, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 7, 7, 0, 0, 0, 0, + 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 9, 8, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 7, 7, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 9, 8, 0, 0, 0, 0, 0, 0, 9,11,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c5_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c5_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p1_0 = { + _vq_quantthresh__44c5_s_p1_0, + _vq_quantmap__44c5_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c5_s_p1_0 = { + 8, 6561, + _vq_lengthlist__44c5_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c5_s_p1_0, + NULL, + &_vq_auxt__44c5_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c5_s_p2_0[] = { + 2, 4, 4, 0, 0, 0, 6, 5, 0, 0, 0, 5, 5, 0, 0, 0, + 7, 7, 0, 0, 0, 0, 0, 0, 0, 4, 6, 5, 0, 0, 0, 8, + 7, 0, 0, 0, 8, 8, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 6, 0, 0, 0, 7, 8, 0, 0, 0, 7, 8, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7, 0, 0, 0, 8, 8, 0, 0, + 0, 8, 8, 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 6, + 7, 8, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 7, 0, 0, 0, 8, 8, 0, 0, 0, 8, 8, + 0, 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, + 0, 0, 8, 8, 0, 0, 0, 8, 8, 0, 0, 0,10,10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 9, 9, 0, 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, + 10,10, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0,10, + 10, 0, 0, 0,10,10, 0, 0, 0,10,10, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c5_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c5_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p2_0 = { + _vq_quantthresh__44c5_s_p2_0, + _vq_quantmap__44c5_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c5_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c5_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c5_s_p2_0, + NULL, + &_vq_auxt__44c5_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c5_s_p3_0[] = { + 2, 4, 3, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 5, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c5_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c5_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p3_0 = { + _vq_quantthresh__44c5_s_p3_0, + _vq_quantmap__44c5_s_p3_0, + 5, + 5 + }; + + static static_codebook _44c5_s_p3_0 = { + 4, 625, + _vq_lengthlist__44c5_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c5_s_p3_0, + NULL, + &_vq_auxt__44c5_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c5_s_p4_0[] = { + 2, 3, 3, 6, 6, 0, 0, 0, 0, 0, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 4, 4, 6, 6, 0, 0, 0, 0, 0, 5, 5, 6, 6, + 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, + 8, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, + 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c5_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c5_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p4_0 = { + _vq_quantthresh__44c5_s_p4_0, + _vq_quantmap__44c5_s_p4_0, + 9, + 9 + }; + + static static_codebook _44c5_s_p4_0 = { + 2, 81, + _vq_lengthlist__44c5_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c5_s_p4_0, + NULL, + &_vq_auxt__44c5_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c5_s_p5_0[] = { + 2, 3, 4, 5, 6, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 6, 6, 7, 7, + 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, 0, 0, + 7, 7, 8, 8,10,10, 0, 0, 0, 7, 8, 8, 8,10,10, 0, + 0, 0, 9, 9, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, + }; + + static float _vq_quantthresh__44c5_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c5_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p5_0 = { + _vq_quantthresh__44c5_s_p5_0, + _vq_quantmap__44c5_s_p5_0, + 9, + 9 + }; + + static static_codebook _44c5_s_p5_0 = { + 2, 81, + _vq_lengthlist__44c5_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c5_s_p5_0, + NULL, + &_vq_auxt__44c5_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c5_s_p6_0[] = { + 2, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11,12, + 12, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 4, 4, 6, 6, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 6, 6, 7, 7, 8, 8, 9,10,10,10,11,11, + 11,12,12,12, 0, 0, 0, 7, 7, 8, 8,10,10,10,10,11, + 11,12,12,12,12, 0, 0, 0, 7, 7, 9, 9,10,10,10,10, + 11,11,12,12,12,12, 0, 0, 0, 7, 7, 8, 9,10,10,10, + 10,11,11,12,12,12,13, 0, 0, 0, 8, 8, 9, 9,10,10, + 10,10,11,11,12,12,13,12, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, + 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, + 8, 9, 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 9, 9,10,10,11,11,11,12,12,12,13,13, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,11,12,12,12,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,12,13,13,13, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,12,13,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,13, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13, + 13, + }; + + static float _vq_quantthresh__44c5_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c5_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p6_0 = { + _vq_quantthresh__44c5_s_p6_0, + _vq_quantmap__44c5_s_p6_0, + 17, + 17 + }; + + static static_codebook _44c5_s_p6_0 = { + 2, 289, + _vq_lengthlist__44c5_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c5_s_p6_0, + NULL, + &_vq_auxt__44c5_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c5_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10,10, 9,11,10,10, 6, 9, 9, + 10, 9,10,11,10, 9, 7,10,10,11,11,11,11,10,10, 6, + 9, 9,10,10, 9,10, 9, 9, 6, 9, 9,10,10,10,11, 9, + 9, + }; + + static float _vq_quantthresh__44c5_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c5_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p7_0 = { + _vq_quantthresh__44c5_s_p7_0, + _vq_quantmap__44c5_s_p7_0, + 3, + 3 + }; + + static static_codebook _44c5_s_p7_0 = { + 4, 81, + _vq_lengthlist__44c5_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c5_s_p7_0, + NULL, + &_vq_auxt__44c5_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c5_s_p7_1[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,10, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, + 7, 8, 8, 8, 8, 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, + 8, 8,10,10,10, 7, 7, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 9, 9, 8, 8, 9, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c5_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c5_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p7_1 = { + _vq_quantthresh__44c5_s_p7_1, + _vq_quantmap__44c5_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c5_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c5_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c5_s_p7_1, + NULL, + &_vq_auxt__44c5_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c5_s_p8_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10,10, 6, 5, 5, + 7, 7, 8, 8, 9, 9,10,10,10,10, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,11,12, 9, 9, 9, 9, 9,10,10,10,11,11, 0,13, + 12, 9, 9, 9, 9,10,10,11,11,11,11, 0, 0, 0, 9,10, + 9, 9,10,10,11,11,12,11, 0, 0, 0,10,10, 9, 9,10, + 10,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,11,12, + 12,12, 0, 0, 0,14,14,10,10,11,11,11,11,12,12, 0, + 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,11,12,12,13,13, + }; + + static float _vq_quantthresh__44c5_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c5_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p8_0 = { + _vq_quantthresh__44c5_s_p8_0, + _vq_quantmap__44c5_s_p8_0, + 13, + 13 + }; + + static static_codebook _44c5_s_p8_0 = { + 2, 169, + _vq_lengthlist__44c5_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c5_s_p8_0, + NULL, + &_vq_auxt__44c5_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c5_s_p8_1[] = { + 2, 4, 4, 5, 5, 6, 5, 5, 5, 5, 6, 4, 5, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c5_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c5_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p8_1 = { + _vq_quantthresh__44c5_s_p8_1, + _vq_quantmap__44c5_s_p8_1, + 5, + 5 + }; + + static static_codebook _44c5_s_p8_1 = { + 2, 25, + _vq_lengthlist__44c5_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c5_s_p8_1, + NULL, + &_vq_auxt__44c5_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p9_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c5_s_p9_0[] = { + 1, 3, 3,11,11,11,11,11,11,11,11,11,11,11,11, 5, + 7, 7,11,11,11,11,11,11,11,11,11,11,11,11, 5, 9, + 7,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, + }; + + static float _vq_quantthresh__44c5_s_p9_0[] = { + -2320.5, -1963.5, -1606.5, -1249.5, -892.5, -535.5, -178.5, 178.5, + 535.5, 892.5, 1249.5, 1606.5, 1963.5, 2320.5, + }; + + static long _vq_quantmap__44c5_s_p9_0[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p9_0 = { + _vq_quantthresh__44c5_s_p9_0, + _vq_quantmap__44c5_s_p9_0, + 15, + 15 + }; + + static static_codebook _44c5_s_p9_0 = { + 2, 225, + _vq_lengthlist__44c5_s_p9_0, + 1, -512522752, 1628852224, 4, 0, + _vq_quantlist__44c5_s_p9_0, + NULL, + &_vq_auxt__44c5_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p9_1[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c5_s_p9_1[] = { + 1, 4, 4, 6, 6, 8, 7, 9, 9,10,10,11,11,12,12,13, + 13, 6, 5, 5, 6, 6, 8, 8,10,10,11,11,12,12,13,13, + 13,13, 6, 5, 5, 7, 7, 8, 8,10,10,11,11,12,12,13, + 13,13,13,18, 7, 7, 8, 8, 9, 9,10,11,11,11,12,12, + 13,13,13,14,18, 7, 7, 8, 8, 9, 9,11,10,12,12,13, + 13,13,13,14,15,18,12,12, 9, 9,10,10,11,11,12,12, + 13,13,13,14,14,14,18,12,12, 9, 8,10,10,11,11,12, + 12,14,13,13,14,15,15,18,16,18,11,11,11,11,12,12, + 13,13,13,14,14,14,14,15,17,18,17,11,10,11, 9,12, + 13,13,13,14,14,13,14,14,14,18,18,18,13,14,11,12, + 12,12,13,14,13,13,14,15,16,15,18,18,18,15,13,12, + 9,12,11,13,14,14,15,14,14,16,14,18,18,18,18,18, + 12,13,13,13,13,14,15,14,15,15,15,15,18,18,18,18, + 17,14,12,13,11,14,12,15,14,14,15,16,15,18,18,18, + 17,18,15,18,13,13,14,13,15,14,16,15,17,16,18,18, + 17,18,18,15,17,14,13,14,12,14,14,15,15,15,15,18, + 18,18,17,17,18,18,14,15,14,14,14,14,15,14,16,16, + 17,18,18,18,18,17,17,15,15,13,13,15,13,15,13,15, + 15, + }; + + static float _vq_quantthresh__44c5_s_p9_1[] = { + -157.5, -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, + 10.5, 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, 157.5, + }; + + static long _vq_quantmap__44c5_s_p9_1[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p9_1 = { + _vq_quantthresh__44c5_s_p9_1, + _vq_quantmap__44c5_s_p9_1, + 17, + 17 + }; + + static static_codebook _44c5_s_p9_1 = { + 2, 289, + _vq_lengthlist__44c5_s_p9_1, + 1, -520814592, 1620377600, 5, 0, + _vq_quantlist__44c5_s_p9_1, + NULL, + &_vq_auxt__44c5_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c5_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__44c5_s_p9_2[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,11, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,11, 5, 5, 7, 7, 7, + 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,11,11,11, 8, 8, 8, 8, + 8, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,11,11, + 11, 8, 8, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10,10,11,11,11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10,11,11,11,11,11, 8, 8, 9, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11,11, + 11,11, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,11,11,11,11,11, 9, 9, 9, 9, + 9, 9,10,10,10,10,10,10,10,10,10,10,11,11,11,11, + 11,11,11, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,11,11,11,11,11,11,11,10, 9,10,10,10,10,10,10, + 10,10,10, 9,10,10,11,11,11,11,11,11,11, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11,10,10,10,10,10, 9,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, + 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,11, + 11,11,11,11,11,11,11,11,10,10,10,10,10,10,10,10, + 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, + }; + + static float _vq_quantthresh__44c5_s_p9_2[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__44c5_s_p9_2[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__44c5_s_p9_2 = { + _vq_quantthresh__44c5_s_p9_2, + _vq_quantmap__44c5_s_p9_2, + 21, + 21 + }; + + static static_codebook _44c5_s_p9_2 = { + 2, 441, + _vq_lengthlist__44c5_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__44c5_s_p9_2, + NULL, + &_vq_auxt__44c5_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c5_s_short[] = { + 3, 9,10,15,10,10,11,15,15,17, 4, 5, 7, 8, 7, 7, + 9,13,15,16, 7, 6, 6,10, 6, 8, 9,12,12,16,10, 8, + 11, 8, 8, 7,11,15,17,17, 8, 5, 5, 8, 3, 4, 6,10, + 15,17,10, 7, 7, 7, 4, 4, 5,10,14,17,10, 9, 8, 9, + 6, 5, 6,10,14,17,12,12,11,12, 9, 8, 8,11,14,17, + 13,14,13,10, 7, 5, 6, 9,13,17,14,14,14,10, 7, 5, + 6, 7,10,15, + }; + + static static_codebook _huff_book__44c5_s_short = { + 2, 100, + _huff_lengthlist__44c5_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c6_s_long[] = { + 3, 8,11,13,13,13,12,12,13,18, 6, 3, 4, 7, 9, 9, + 11,11,13,16, 9, 4, 3, 5, 7, 7, 9,10,14,18,11, 7, + 4, 4, 6, 6, 8,10,14,15,11, 9, 6, 6, 6, 6, 8,10, + 13,15,10, 9, 7, 6, 6, 6, 7, 8,12,12,12,10, 9, 8, + 7, 6, 6, 7,11,12,11,10,10, 9, 9, 7, 7, 6, 9,12, + 12,12,13,13,13,10, 9, 8,10,12,13,14,16,16,17,14, + 12,11,11,13, + }; + + static static_codebook _huff_book__44c6_s_long = { + 2, 100, + _huff_lengthlist__44c6_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c6_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 5, 8, 7, 0, 9, 8, 0, + 8, 8, 6, 7, 8, 0, 8, 9, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 8, 8, 0, 8, 8, 0, 8, 8, 5, 8, 8, + 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, + 8, + }; + + static float _vq_quantthresh__44c6_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c6_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p1_0 = { + _vq_quantthresh__44c6_s_p1_0, + _vq_quantmap__44c6_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c6_s_p1_0 = { + 4, 81, + _vq_lengthlist__44c6_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c6_s_p1_0, + NULL, + &_vq_auxt__44c6_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c6_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 5, 5, 9, 9, 0, 5, 5, 9, 9, 0, + 7, 7,10,10, 0, 0, 0,10,10, 5, 7, 7, 9, 9, 0, 8, + 7,10, 9, 0, 8, 8,10,10, 0,10,10,11,11, 0, 0, 0, + 11,11, 5, 7, 7, 9, 9, 0, 7, 8, 9,10, 0, 7, 8,10, + 10, 0,10,10,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, + 0,11,10,12,12, 0,11,11,12,12, 0,13,13,14,14, 0, + 0, 0,14,14, 8, 9, 9,10,11, 0,10,11,12,12, 0,11, + 11,12,12, 0,13,13,14,14, 0, 0, 0,14,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 8,11,11, 0, 7, 7,10,10, + 0, 7, 7,10,10, 0, 9, 8,11,10, 0, 0, 0,11,11, 5, + 7, 8,11,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 8, + 9,10,11, 0, 0, 0,11,11, 9,10,10,12,12, 0,10,10, + 12,11, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, + 13, 9,10,10,12,12, 0,10,10,11,12, 0,10,10,12,12, + 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, 0, 7, 7, + 10,10, 0, 8, 9,11,11, 0, 0, 0,11,10, 5, 7, 8,10, + 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 8,11,11, + 0, 0, 0,11,11, 9,10,10,12,12, 0,10,10,12,12, 0, + 10,10,12,12, 0,12,12,13,13, 0, 0, 0,13,13, 9, 9, + 10,12,12, 0,10,10,12,12, 0,10,10,12,12, 0,12,12, + 13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7,10,10,13,13, 0, 9, 8,12,12, 0, 8, 9,12,12, 0, + 10, 9,12,12, 0, 0, 0,12,12, 7,10,10,13,13, 0, 9, + 9,12,12, 0, 9, 8,12,12, 0, 9,10,12,12, 0, 0, 0, + 12,12,10,11,11,14,14, 0,11,10,13,13, 0,11,11,13, + 13, 0,12,12,13,13, 0, 0, 0,13,13,10,11,11,14,14, + 0,10,11,13,13, 0,11,11,13,13, 0,12,12,13,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, + 11,11,14,14, 0,11,11,13,13, 0,11,10,13,13, 0,12, + 12,13,13, 0, 0, 0,13,13,10,11,11,14,14, 0,11,11, + 13,13, 0,10,11,13,13, 0,12,12,13,13, 0, 0, 0,13, + 13, + }; + + static float _vq_quantthresh__44c6_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c6_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p2_0 = { + _vq_quantthresh__44c6_s_p2_0, + _vq_quantmap__44c6_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c6_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c6_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c6_s_p2_0, + NULL, + &_vq_auxt__44c6_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c6_s_p3_0[] = { + 2, 4, 4, 5, 5, 7, 7, 9, 9, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, + 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, + 7, 7, 8, 8,10,10, 0, 0, 0, 7, 7, 9, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c6_s_p3_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c6_s_p3_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p3_0 = { + _vq_quantthresh__44c6_s_p3_0, + _vq_quantmap__44c6_s_p3_0, + 9, + 9 + }; + + static static_codebook _44c6_s_p3_0 = { + 2, 81, + _vq_lengthlist__44c6_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c6_s_p3_0, + NULL, + &_vq_auxt__44c6_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c6_s_p4_0[] = { + 3, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11, + 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 8, 9,10,10,11,11, + 11,11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 11,11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, + 10,11,11,12,12,12,12, 0, 0, 0, 6, 6, 7, 7, 9, 9, + 10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, 7, 7, 9, + 9,10,10,11,11,12,12,12,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c6_s_p4_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c6_s_p4_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p4_0 = { + _vq_quantthresh__44c6_s_p4_0, + _vq_quantmap__44c6_s_p4_0, + 17, + 17 + }; + + static static_codebook _44c6_s_p4_0 = { + 2, 289, + _vq_lengthlist__44c6_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c6_s_p4_0, + NULL, + &_vq_auxt__44c6_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p5_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c6_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 4, 7, 7, 9,10,10,10, + 10,10, 4, 7, 7, 9,10,10,10,10,10, 5, 9, 9, 9,11, + 11, 9,11,11, 7,10,10,11,12,11,12,12,12, 7,10,10, + 11,12,12,12,12,12, 6,10,10, 9,11,11,10,11,11, 7, + 10, 9,11,12,12,11,12,11, 7,10,10,11,12,12,11,12, + 12, + }; + + static float _vq_quantthresh__44c6_s_p5_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c6_s_p5_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p5_0 = { + _vq_quantthresh__44c6_s_p5_0, + _vq_quantmap__44c6_s_p5_0, + 3, + 3 + }; + + static static_codebook _44c6_s_p5_0 = { + 4, 81, + _vq_lengthlist__44c6_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c6_s_p5_0, + NULL, + &_vq_auxt__44c6_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c6_s_p5_1[] = { + 3, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,11, 4, 4, 6, 6, + 8, 8, 9, 9, 9, 9,11, 4, 4, 6, 6, 8, 8, 9, 8, 9, + 9,12, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,12,12,12, 6, + 6, 8, 8, 9, 9, 9, 9,11,11,11, 7, 7, 8, 8, 9, 9, + 9, 9,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9,11,11,11, + 7, 7, 8, 8, 8, 8, 9, 9,11,11,11,11,11, 8, 8, 8, + 8, 9, 9,11,11,11,11,11, 7, 7, 8, 8, 8, 8,11,11, + 11,11,11, 7, 7, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c6_s_p5_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c6_s_p5_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p5_1 = { + _vq_quantthresh__44c6_s_p5_1, + _vq_quantmap__44c6_s_p5_1, + 11, + 11 + }; + + static static_codebook _44c6_s_p5_1 = { + 2, 121, + _vq_lengthlist__44c6_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c6_s_p5_1, + NULL, + &_vq_auxt__44c6_s_p5_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c6_s_p6_0[] = { + 1, 4, 4, 6, 7, 8, 8, 8, 8, 9, 9,10,10, 5, 5, 5, + 7, 7, 9, 9, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 9, + 9, 9, 9,10,10,11,11, 0, 7, 7, 7, 7, 9, 9,10,10, + 11,11,11,11, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12, 0,11,11, 8, 8,10, 9,10,11,11,11,12,12, 0,12, + 12, 8, 8,10, 9,11,11,12,11,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + static float _vq_quantthresh__44c6_s_p6_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c6_s_p6_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p6_0 = { + _vq_quantthresh__44c6_s_p6_0, + _vq_quantmap__44c6_s_p6_0, + 13, + 13 + }; + + static static_codebook _44c6_s_p6_0 = { + 2, 169, + _vq_lengthlist__44c6_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c6_s_p6_0, + NULL, + &_vq_auxt__44c6_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c6_s_p6_1[] = { + 3, 4, 4, 5, 5, 6, 4, 4, 5, 5, 6, 4, 4, 5, 4, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c6_s_p6_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c6_s_p6_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p6_1 = { + _vq_quantthresh__44c6_s_p6_1, + _vq_quantmap__44c6_s_p6_1, + 5, + 5 + }; + + static static_codebook _44c6_s_p6_1 = { + 2, 25, + _vq_lengthlist__44c6_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c6_s_p6_1, + NULL, + &_vq_auxt__44c6_s_p6_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c6_s_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 5, 5, + 7, 7, 8, 8, 9, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9, 9, 9,11,11,12,12,19, 7, 7, 7, 7, 9, 9,10,10, + 11,11,12,12,19, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12,19,11,11, 8, 8,10,10,11,11,11,12,12,12,19,12, + 12, 8, 8,10, 9,11,11,12,12,13,12,19,19,19,11,11, + 10,10,11,11,12,12,13,13,19,19,19,11,11,10,10,11, + 11,12,12,13,13,19,19,19,14,14,11,11,11,12,13,13, + 13,13,19,19,19,15,15,11,11,12,12,13,12,14,14,19, + 19,19,19,18,13,13,12,12,13,13,14,14,18,18,18,18, + 18,13,12,12,12,13,13,14,14, + }; + + static float _vq_quantthresh__44c6_s_p7_0[] = { + -60.5, -49.5, -38.5, -27.5, -16.5, -5.5, 5.5, 16.5, + 27.5, 38.5, 49.5, 60.5, + }; + + static long _vq_quantmap__44c6_s_p7_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p7_0 = { + _vq_quantthresh__44c6_s_p7_0, + _vq_quantmap__44c6_s_p7_0, + 13, + 13 + }; + + static static_codebook _44c6_s_p7_0 = { + 2, 169, + _vq_lengthlist__44c6_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + _vq_quantlist__44c6_s_p7_0, + NULL, + &_vq_auxt__44c6_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c6_s_p7_1[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 9, 5, 5, 7, 7, + 7, 7, 7, 7, 8, 8, 9, 5, 5, 6, 6, 7, 7, 7, 7, 7, + 7, 9, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 9, 9, 9, 7, + 7, 7, 7, 7, 8, 7, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, + 7, 7, 8, 8, 7, 7, 8, 8, 9, 9, 9, 8, 9, 8, 8, 7, + 7, 7, 7, 9, 9, 8, 8, 9, 8, 8, 7, 7, 8, 8, 9, 9, + 9, 9, 8, 7, 7, 7, 7, 8, 8, + }; + + static float _vq_quantthresh__44c6_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c6_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p7_1 = { + _vq_quantthresh__44c6_s_p7_1, + _vq_quantmap__44c6_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c6_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c6_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c6_s_p7_1, + NULL, + &_vq_auxt__44c6_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c6_s_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 7, 7, 9, 9, 9,10,11,11, 6, + 5, 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11, 6, 5, + 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11,17, 8, 8, + 8, 8,10,10, 8, 9,10,10,11,11,12,11,17, 8, 8, 9, + 9,10,10, 9, 9,10,10,11,12,12,12,17,12,13, 9, 9, + 10,10, 9,10,10,10,11,11,13,12,17,13,13,10, 9,10, + 10,10,10,10,11,12,11,12,12,17,17,17, 9, 9, 9, 9, + 10,10,11,11,11,12,12,13,17,17,17, 9, 9, 9, 9,11, + 10,11,11,12,12,12,13,17,17,17,13,13,10,10,11,11, + 12,11,12,13,13,13,17,17,17,14,13,10, 9,11, 9,12, + 12,12,13,13,14,17,17,17,17,17,11,12,11,11,12,12, + 13,14,13,14,17,17,17,17,17,12,10,11, 8,12,11,13, + 14,14,14,17,17,16,16,16,13,15,11,12,12,13,13,13, + 14,14,16,16,16,16,16,14,13,12, 9,13,10,14,13,14, + 13, + }; + + static float _vq_quantthresh__44c6_s_p8_0[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__44c6_s_p8_0[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p8_0 = { + _vq_quantthresh__44c6_s_p8_0, + _vq_quantmap__44c6_s_p8_0, + 15, + 15 + }; + + static static_codebook _44c6_s_p8_0 = { + 2, 225, + _vq_lengthlist__44c6_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__44c6_s_p8_0, + NULL, + &_vq_auxt__44c6_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__44c6_s_p8_1[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 8, 9, 9, 9,11, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,11,10,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10, 9,10, 9, + 10,10, 9,11,11,11, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10, 9,10, 9, 9, 9, 9,11,11,11,11,11, 8, 8, 9, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,11,11,11, + 11,11, 9, 9, 9, 9, 9, 9,10, 9, 9, 9,10,10, 9, 9, + 9, 9,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9,10,10, + 9,10, 9,10,10,10,10,11,11,11,11,11, 9, 9, 9, 9, + 9, 9,10,10,10,10, 9,10,10, 9,10, 9,11,11,11,11, + 11,11,11, 9, 9, 9, 9,10, 9,10, 9, 9,10,10,10,10, + 10,10,11,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10, + 9,10, 9,10,10, 9,11,11,11,11,11,11,10, 9, 9, 9, + 9, 9,10, 9,10,10,10,10,10,10,10,11,11,11,11,11, + 11,11, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,11,11,11,11,11,11, 9,10, 9,10, 9,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,11,11,10,10, + 10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10, 9,10,10,10,10, 9,10, 9,10,10,11, + 11,11,11,11,11,11,11,11,10,10,10, 9,10,10,10,10, + 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,10, + 10, 9,10,10,10,10,10,10,10, + }; + + static float _vq_quantthresh__44c6_s_p8_1[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__44c6_s_p8_1[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p8_1 = { + _vq_quantthresh__44c6_s_p8_1, + _vq_quantmap__44c6_s_p8_1, + 21, + 21 + }; + + static static_codebook _44c6_s_p8_1 = { + 2, 441, + _vq_lengthlist__44c6_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__44c6_s_p8_1, + NULL, + &_vq_auxt__44c6_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c6_s_p9_0[] = { + 1, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__44c6_s_p9_0[] = { + -3503.5, -2866.5, -2229.5, -1592.5, -955.5, -318.5, 318.5, 955.5, + 1592.5, 2229.5, 2866.5, 3503.5, + }; + + static long _vq_quantmap__44c6_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p9_0 = { + _vq_quantthresh__44c6_s_p9_0, + _vq_quantmap__44c6_s_p9_0, + 13, + 13 + }; + + static static_codebook _44c6_s_p9_0 = { + 2, 169, + _vq_lengthlist__44c6_s_p9_0, + 1, -511845376, 1630791680, 4, 0, + _vq_quantlist__44c6_s_p9_0, + NULL, + &_vq_auxt__44c6_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c6_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 7, 8, 9,10,11, 6, 6, 6, + 7, 8, 8, 8, 7, 8, 9,10,11,10, 6, 5, 6, 7, 8, 8, + 8, 8, 8, 9,10,10,11,14, 9, 8, 8, 8, 9, 8, 8, 9, + 10,10,12,11,14, 8, 8, 9, 8, 9, 8, 8, 8,11,10,11, + 11,14,14,13, 8, 9, 9, 9, 9,10,11,11,12,12,13,12, + 12, 8, 7,10, 9, 9, 9,11,11,11,10,13,13,13, 8, 9, + 9, 8,12,11,11,11,13,11,13,13,13, 9, 8, 9, 8,10, + 10,11,10,11,10,13,13,13,12,12, 9,10,11,11,11,12, + 13,12,13,13,13,13,12,10,10,10, 9,13,12,12,13,13, + 13,13,13,13,12,12,10,10,12,12,13,13,13,13,13,13, + 13,12,12,11,12,12,12,12,13, + }; + + static float _vq_quantthresh__44c6_s_p9_1[] = { + -269.5, -220.5, -171.5, -122.5, -73.5, -24.5, 24.5, 73.5, + 122.5, 171.5, 220.5, 269.5, + }; + + static long _vq_quantmap__44c6_s_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p9_1 = { + _vq_quantthresh__44c6_s_p9_1, + _vq_quantmap__44c6_s_p9_1, + 13, + 13 + }; + + static static_codebook _44c6_s_p9_1 = { + 2, 169, + _vq_lengthlist__44c6_s_p9_1, + 1, -518889472, 1622704128, 4, 0, + _vq_quantlist__44c6_s_p9_1, + NULL, + &_vq_auxt__44c6_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c6_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, + }; + + static long _vq_lengthlist__44c6_s_p9_2[] = { + 2, 4, 3, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 7, 6, 7, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + }; + + static float _vq_quantthresh__44c6_s_p9_2[] = { + -23.5, -22.5, -21.5, -20.5, -19.5, -18.5, -17.5, -16.5, + -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, -9.5, -8.5, + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, + 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, + }; + + static long _vq_quantmap__44c6_s_p9_2[] = { + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, + 48, + }; + + static encode_aux_threshmatch _vq_auxt__44c6_s_p9_2 = { + _vq_quantthresh__44c6_s_p9_2, + _vq_quantmap__44c6_s_p9_2, + 49, + 49 + }; + + static static_codebook _44c6_s_p9_2 = { + 1, 49, + _vq_lengthlist__44c6_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + _vq_quantlist__44c6_s_p9_2, + NULL, + &_vq_auxt__44c6_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c6_s_short[] = { + 4, 9,11,11,13,13,17,16,17,17, 4, 4, 6, 7, 9, 9, + 12,15,17,17, 7, 5, 4, 5, 7, 8,11,12,17,17, 9, 6, + 4, 3, 5, 6,10,14,17,17,11, 8, 6, 4, 5, 6, 9,13, + 17,17,11,10, 7, 5, 5, 5, 8,12,17,17,13,12, 9, 8, + 7, 6, 8,11,17,17,13,13, 9, 6, 6, 5, 6, 9,17,17, + 17,16,10, 8, 7, 7, 8, 9,17,17,17,17,14,12,11,11, + 11,13,17,17, + }; + + static static_codebook _huff_book__44c6_s_short = { + 2, 100, + _huff_lengthlist__44c6_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c7_s_long[] = { + 3, 8,11,13,14,13,13,12,14,16, 6, 4, 5, 7, 9,10, + 11,11,13,15,10, 4, 3, 5, 7, 7,10,10,14,16,11, 7, + 4, 4, 5, 6, 8,10,13,15,12, 9, 6, 5, 5, 6, 8, 9, + 13,15,11, 9, 7, 6, 5, 5, 6, 8,11,13,11,10, 9, 8, + 7, 6, 6, 7,11,12,12,11,10, 9, 8, 7, 6, 6, 9,11, + 12,12,12,12,12,10, 9, 8,10,12,12,14,15,16,16,14, + 12,10,11,13, + }; + + static static_codebook _huff_book__44c7_s_long = { + 2, 100, + _huff_lengthlist__44c7_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c7_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 6, 8, 7, 0, 9, 8, 0, + 8, 8, 5, 7, 8, 0, 8, 9, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 8, 8, 0, 8, 8, 0, 8, 8, 5, 8, 8, + 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 8, 0, 8, 8, 0, 8, 8, 5, 8, 9, 0, 8, 8, 0, 8, + 8, + }; + + static float _vq_quantthresh__44c7_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c7_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p1_0 = { + _vq_quantthresh__44c7_s_p1_0, + _vq_quantmap__44c7_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c7_s_p1_0 = { + 4, 81, + _vq_lengthlist__44c7_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c7_s_p1_0, + NULL, + &_vq_auxt__44c7_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c7_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 5, 5, 9, 9, 0, 5, 5, 9, 9, 0, + 7, 7,10, 9, 0, 0, 0, 9,10, 5, 7, 7, 9, 9, 0, 8, + 7,10, 9, 0, 8, 7,10, 9, 0,10, 9,11,11, 0, 0, 0, + 11,11, 6, 7, 7, 9, 9, 0, 7, 8, 9,10, 0, 7, 8,10, + 10, 0, 9, 9,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, + 0,11,10,12,12, 0,11,11,12,12, 0,13,13,14,14, 0, + 0, 0,14,14, 8, 9, 9,10,11, 0,10,11,11,12, 0,11, + 11,12,12, 0,13,13,14,14, 0, 0, 0,14,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 5, 8, 7,11,11, 0, 7, 7,10,10, + 0, 7, 7,10,10, 0, 9, 8,11,10, 0, 0, 0,11,11, 5, + 7, 8,11,11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 8, + 9,10,11, 0, 0, 0,11,11, 9,10,10,12,12, 0,10,10, + 12,11, 0,10,10,12,12, 0,12,12,13,13, 0, 0, 0,13, + 13, 9,10,10,12,12, 0,10,10,11,12, 0,10,10,12,12, + 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 7,11,10, 0, 7, 7,10,10, 0, 7, 7, + 10,10, 0, 9, 9,11,11, 0, 0, 0,11,10, 5, 7, 8,10, + 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 9,11,11, + 0, 0, 0,10,11, 9,10, 9,12,11, 0,10,10,12,12, 0, + 10,10,12,11, 0,12,12,13,13, 0, 0, 0,13,13, 9, 9, + 10,11,12, 0,10,10,12,12, 0,10,10,11,12, 0,12,12, + 13,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 9, 9,13,13, 0, 9, 8,12,12, 0, 8, 9,12,12, 0, + 10, 9,12,12, 0, 0, 0,12,12, 7,10, 9,13,13, 0, 9, + 9,12,12, 0, 9, 8,12,12, 0, 9,10,12,12, 0, 0, 0, + 12,12,10,11,11,14,14, 0,11,10,13,12, 0,11,11,13, + 13, 0,12,12,13,13, 0, 0, 0,13,13,10,11,11,14,14, + 0,10,11,12,13, 0,11,11,13,13, 0,12,12,13,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,10, + 11,11,14,14, 0,11,11,13,13, 0,11,10,13,13, 0,12, + 12,13,13, 0, 0, 0,13,13,10,11,11,14,14, 0,11,11, + 13,13, 0,10,11,13,13, 0,12,12,13,13, 0, 0, 0,13, + 13, + }; + + static float _vq_quantthresh__44c7_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c7_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p2_0 = { + _vq_quantthresh__44c7_s_p2_0, + _vq_quantmap__44c7_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c7_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c7_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c7_s_p2_0, + NULL, + &_vq_auxt__44c7_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c7_s_p3_0[] = { + 2, 4, 4, 5, 5, 7, 7, 8, 8, 0, 4, 4, 6, 6, 7, 7, + 9, 9, 0, 4, 4, 6, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, + 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, + 7, 7, 9, 9,10,10, 0, 0, 0, 7, 7, 9, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c7_s_p3_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c7_s_p3_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p3_0 = { + _vq_quantthresh__44c7_s_p3_0, + _vq_quantmap__44c7_s_p3_0, + 9, + 9 + }; + + static static_codebook _44c7_s_p3_0 = { + 2, 81, + _vq_lengthlist__44c7_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c7_s_p3_0, + NULL, + &_vq_auxt__44c7_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c7_s_p4_0[] = { + 3, 4, 4, 6, 5, 7, 7, 7, 7, 8, 8, 9, 9,10,10,11, + 11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9,10,10,10, + 11,11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8,10,10,10, + 11,11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, + 10,11,11,12,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c7_s_p4_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c7_s_p4_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p4_0 = { + _vq_quantthresh__44c7_s_p4_0, + _vq_quantmap__44c7_s_p4_0, + 17, + 17 + }; + + static static_codebook _44c7_s_p4_0 = { + 2, 289, + _vq_lengthlist__44c7_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c7_s_p4_0, + NULL, + &_vq_auxt__44c7_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p5_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c7_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 5, 7, 7, 4, 7, 7,10,11,10,10, + 11,11, 4, 7, 7,10,10,11,10,10,11, 5,10,10, 9,12, + 11,10,12,12, 7,11,10,12,12,12,12,13,13, 7,10,11, + 11,12,12,12,13,13, 5,10,10,10,12,12,10,12,12, 7, + 11,10,12,13,13,12,12,12, 7,10,11,12,13,13,12,12, + 12, + }; + + static float _vq_quantthresh__44c7_s_p5_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c7_s_p5_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p5_0 = { + _vq_quantthresh__44c7_s_p5_0, + _vq_quantmap__44c7_s_p5_0, + 3, + 3 + }; + + static static_codebook _44c7_s_p5_0 = { + 4, 81, + _vq_lengthlist__44c7_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c7_s_p5_0, + NULL, + &_vq_auxt__44c7_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c7_s_p5_1[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 9,12, 4, 4, 6, 6, + 7, 7, 8, 8, 9, 9,11, 5, 5, 6, 6, 7, 7, 8, 8, 9, + 9,12, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,12,12,12, 6, + 6, 7, 7, 8, 8, 9, 9,12,12,12, 6, 6, 7, 7, 8, 8, + 9, 9,12,11,11, 6, 6, 7, 7, 8, 8, 9, 9,12,12,11, + 7, 7, 8, 8, 8, 8, 8, 8,12,12,12,11,11, 8, 8, 8, + 8, 8, 8,12,12,12,11,11, 7, 7, 7, 7, 8, 8,12,12, + 12,11,11, 7, 7, 7, 7, 8, 8, + }; + + static float _vq_quantthresh__44c7_s_p5_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c7_s_p5_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p5_1 = { + _vq_quantthresh__44c7_s_p5_1, + _vq_quantmap__44c7_s_p5_1, + 11, + 11 + }; + + static static_codebook _44c7_s_p5_1 = { + 2, 121, + _vq_lengthlist__44c7_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c7_s_p5_1, + NULL, + &_vq_auxt__44c7_s_p5_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c7_s_p6_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10, 9,10,10, 5, 5, 5, + 7, 7, 9, 9, 9, 9,10,10,11,11, 6, 5, 5, 7, 7, 9, + 9, 9, 9,11,10,11,11, 0, 6, 6, 7, 7, 9, 9,10,10, + 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12, 0,11,10, 8, 8,10,10,11,11,11,12,12,12, 0,11, + 11, 8, 8,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + static float _vq_quantthresh__44c7_s_p6_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c7_s_p6_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p6_0 = { + _vq_quantthresh__44c7_s_p6_0, + _vq_quantmap__44c7_s_p6_0, + 13, + 13 + }; + + static static_codebook _44c7_s_p6_0 = { + 2, 169, + _vq_lengthlist__44c7_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c7_s_p6_0, + NULL, + &_vq_auxt__44c7_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c7_s_p6_1[] = { + 3, 4, 4, 5, 5, 6, 4, 4, 5, 5, 6, 4, 4, 4, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c7_s_p6_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c7_s_p6_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p6_1 = { + _vq_quantthresh__44c7_s_p6_1, + _vq_quantmap__44c7_s_p6_1, + 5, + 5 + }; + + static static_codebook _44c7_s_p6_1 = { + 2, 25, + _vq_lengthlist__44c7_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c7_s_p6_1, + NULL, + &_vq_auxt__44c7_s_p6_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c7_s_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 5, 5, + 7, 7, 9, 8, 9, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9, 9,10,11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10, + 11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12,20,11,11, 8, 8,10, 9,11,11,11,11,12,12,20,12, + 12, 8, 8, 9, 9,11,11,12,12,12,12,20,20,20,11,11, + 10,10,11,11,12,12,13,13,20,20,20,11,11,10,10,11, + 11,12,12,13,13,20,20,20,14,14,11,11,11,12,13,13, + 13,13,20,20,20,15,14,11,11,11,11,13,13,14,14,20, + 20,20,20,19,12,12,12,12,13,13,14,14,19,19,19,19, + 19,13,12,12,12,13,13,14,14, + }; + + static float _vq_quantthresh__44c7_s_p7_0[] = { + -60.5, -49.5, -38.5, -27.5, -16.5, -5.5, 5.5, 16.5, + 27.5, 38.5, 49.5, 60.5, + }; + + static long _vq_quantmap__44c7_s_p7_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p7_0 = { + _vq_quantthresh__44c7_s_p7_0, + _vq_quantmap__44c7_s_p7_0, + 13, + 13 + }; + + static static_codebook _44c7_s_p7_0 = { + 2, 169, + _vq_lengthlist__44c7_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + _vq_quantlist__44c7_s_p7_0, + NULL, + &_vq_auxt__44c7_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c7_s_p7_1[] = { + 3, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7, 9, 5, 5, 6, 6, + 7, 7, 7, 7, 8, 8, 9, 5, 5, 6, 6, 7, 7, 7, 7, 7, + 7, 9, 6, 6, 7, 7, 7, 7, 8, 8, 7, 8, 9, 9, 9, 7, + 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, + 8, 8, 9, 9, 9, 7, 7, 7, 7, 7, 7, 8, 8, 9, 9, 9, + 7, 7, 8, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 8, 7, 9, 9, 9, 9, 9, 8, 8, 7, 7, 8, 8, 9, 9, + 9, 9, 9, 7, 7, 7, 7, 8, 8, + }; + + static float _vq_quantthresh__44c7_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c7_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p7_1 = { + _vq_quantthresh__44c7_s_p7_1, + _vq_quantmap__44c7_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c7_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c7_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c7_s_p7_1, + NULL, + &_vq_auxt__44c7_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c7_s_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9, 9,10,11,11, 6, + 5, 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11, 6, 5, + 5, 8, 8, 9, 9, 8, 8, 9, 9,10,10,11,11,17, 8, 8, + 8, 8,10, 9, 8, 9,10,10,11,11,11,11,17, 8, 8, 8, + 8,10,10, 9, 9,10,10,11,11,12,12,17,12,13, 9, 9, + 10,10, 9, 9,10,11,11,11,12,12,17,13,13, 9, 9,10, + 10,10,10,10,10,11,11,12,12,17,17,17, 9, 9, 9, 9, + 10,10,11,11,11,12,12,12,17,17,17, 9, 9, 9, 9,11, + 10,11,12,11,12,13,12,17,17,17,13,14,10,10,10,11, + 12,11,12,12,12,13,17,17,17,14,14,10, 9,10, 9,12, + 12,12,12,13,13,17,17,17,17,17,11,11,11,11,11,12, + 13,13,13,14,17,17,17,17,17,12,10,11, 9,12,11,13, + 15,14,14,17,17,17,17,17,14,15,11,12,12,13,13,12, + 14,14,17,16,16,16,16,15,13,12, 9,12,10,14,12,15, + 14, + }; + + static float _vq_quantthresh__44c7_s_p8_0[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__44c7_s_p8_0[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p8_0 = { + _vq_quantthresh__44c7_s_p8_0, + _vq_quantmap__44c7_s_p8_0, + 15, + 15 + }; + + static static_codebook _44c7_s_p8_0 = { + 2, 225, + _vq_lengthlist__44c7_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__44c7_s_p8_0, + NULL, + &_vq_auxt__44c7_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__44c7_s_p8_1[] = { + 3, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, + 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11, + 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,11,11,11, 7, 7, 8, 8, 8, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, + 10,10, 9,11,11,11, 8, 9, 9, 8, 9, 9, 9, 9, 9, 9, + 9, 9,10,10, 9, 9,10, 9,11,11,11,11,11, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,11,10,11, + 11,11, 9, 9, 9, 9, 9, 9,10, 9,10,10,10,10,10, 9, + 9,10,11,11,11,11,11, 9, 9, 9, 9, 9, 9, 9, 9,10, + 10, 9, 9,10,10,10,10,11,11,11,11,11, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 9,10,10,10,10, 9,11,11,10,11, + 11,11,11, 9, 9, 9, 9,10,10,10,10,10,10,10, 9,10, + 10,10,11,11,11,11,11,11, 9, 9, 9, 9, 9,10,10,10, + 10,10, 9, 9,10, 9,11,10,11,11,11,11,11, 9, 9, 9, + 9, 9,10,10, 9,10,10,10,10,10,10,11,11,11,11,11, + 11,11,10, 9,10, 9,10,10,10,10,10,10,10,10,10, 9, + 10,11,10,11,11,11,11,11,10, 9, 9,10,10,10,10,10, + 10,10,10,10,10,11,11,11,11,11,11,11,10,11,10,10, + 10,10,10,10,10,10, 9,10,10, 9,11,11,11,11,11,10, + 11,11,11,10,10, 9, 9,10,10,10,10,10, 9,10,10,11, + 11,11,11,11,10,11,11,11,10,10, 9, 9,10,10,10,10, + 10,10,10,10,11,11,11,11,11,11,11,11,11,11,11, 9, + 9, 9, 9,10,10,10,10,10,10, + }; + + static float _vq_quantthresh__44c7_s_p8_1[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__44c7_s_p8_1[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p8_1 = { + _vq_quantthresh__44c7_s_p8_1, + _vq_quantmap__44c7_s_p8_1, + 21, + 21 + }; + + static static_codebook _44c7_s_p8_1 = { + 2, 441, + _vq_lengthlist__44c7_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__44c7_s_p8_1, + NULL, + &_vq_auxt__44c7_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c7_s_p9_0[] = { + 1, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 5, 9, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 6, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 8, 8, 8, + }; + + static float _vq_quantthresh__44c7_s_p9_0[] = { + -3503.5, -2866.5, -2229.5, -1592.5, -955.5, -318.5, 318.5, 955.5, + 1592.5, 2229.5, 2866.5, 3503.5, + }; + + static long _vq_quantmap__44c7_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p9_0 = { + _vq_quantthresh__44c7_s_p9_0, + _vq_quantmap__44c7_s_p9_0, + 13, + 13 + }; + + static static_codebook _44c7_s_p9_0 = { + 2, 169, + _vq_lengthlist__44c7_s_p9_0, + 1, -511845376, 1630791680, 4, 0, + _vq_quantlist__44c7_s_p9_0, + NULL, + &_vq_auxt__44c7_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p9_1[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c7_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 7, 9, 8,10,10, 6, 6, 6, + 7, 8, 8, 8, 8, 8, 9, 9,10,11, 6, 5, 6, 8, 7, 8, + 8, 8, 8, 9, 9,10,11,14, 9, 8, 9, 8, 9, 8, 8, 9, + 10,10,11,11,14, 8, 9, 8, 8, 8, 9, 9, 8,12,10,11, + 11,14,13,13, 8, 9, 9, 9, 9,10,10,12,12,12,14,14, + 13, 8, 7,10, 9, 9,10,10,11,11,10,14,14,14, 8, 9, + 9, 8,11,10,12,11,11,11,14,14,14, 9, 7, 9, 8,10, + 10,11,11,11,10,14,14,14,12,12,10, 9,11,11,11,13, + 12,13,14,14,14,12,12,10,10,11, 8,11,11,14,13,14, + 14,14,14,14,12,13,11,12,12,11,14,13,13,13,13,13, + 13,12,11,11, 9,12,12,12,13, + }; + + static float _vq_quantthresh__44c7_s_p9_1[] = { + -269.5, -220.5, -171.5, -122.5, -73.5, -24.5, 24.5, 73.5, + 122.5, 171.5, 220.5, 269.5, + }; + + static long _vq_quantmap__44c7_s_p9_1[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p9_1 = { + _vq_quantthresh__44c7_s_p9_1, + _vq_quantmap__44c7_s_p9_1, + 13, + 13 + }; + + static static_codebook _44c7_s_p9_1 = { + 2, 169, + _vq_lengthlist__44c7_s_p9_1, + 1, -518889472, 1622704128, 4, 0, + _vq_quantlist__44c7_s_p9_1, + NULL, + &_vq_auxt__44c7_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c7_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, + }; + + static long _vq_lengthlist__44c7_s_p9_2[] = { + 2, 4, 3, 4, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + }; + + static float _vq_quantthresh__44c7_s_p9_2[] = { + -23.5, -22.5, -21.5, -20.5, -19.5, -18.5, -17.5, -16.5, + -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, -9.5, -8.5, + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, + 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, + }; + + static long _vq_quantmap__44c7_s_p9_2[] = { + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, + 48, + }; + + static encode_aux_threshmatch _vq_auxt__44c7_s_p9_2 = { + _vq_quantthresh__44c7_s_p9_2, + _vq_quantmap__44c7_s_p9_2, + 49, + 49 + }; + + static static_codebook _44c7_s_p9_2 = { + 1, 49, + _vq_lengthlist__44c7_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + _vq_quantlist__44c7_s_p9_2, + NULL, + &_vq_auxt__44c7_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c7_s_short[] = { + 4,10,12,13,15,15,16,16,17,17, 5, 5, 7, 8, 9, 9, + 12,17,18,18, 7, 5, 4, 5, 7, 8,10,13,18,18, 8, 6, + 5, 4, 5, 6, 9,12,17,18,10, 9, 6, 4, 4, 5, 8,12, + 18,17,11, 9, 7, 5, 4, 4, 6,10,17,17,13,12,10, 8, + 6, 5, 6, 9,17,17,14,13,12, 7, 6, 5, 5, 8,16,17, + 16,15,14, 8, 8, 7, 7, 9,14,17,17,17,17,12,11,11, + 11,12,16,17, + }; + + static static_codebook _huff_book__44c7_s_short = { + 2, 100, + _huff_lengthlist__44c7_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c8_s_long[] = { + 3, 8,12,14,14,13,13,12,13,15, 6, 4, 6, 8,10,10, + 11,11,13,15, 9, 5, 4, 5, 7, 8, 9,10,13,15,11, 7, + 4, 4, 5, 6, 8, 9,13,14,12, 9, 6, 5, 5, 5, 7, 9, + 12,14,11,10, 7, 6, 5, 4, 6, 7,11,12,11,10, 9, 8, + 7, 5, 6, 6,10,11,12,11,10, 9, 8, 6, 6, 5, 8,10, + 12,12,12,11,11,10, 9, 7, 8,11,12,13,14,14,15,13, + 10, 9, 9,11, + }; + + static static_codebook _huff_book__44c8_s_long = { + 2, 100, + _huff_lengthlist__44c8_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c8_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 6, 7, 7, 0, 9, 8, 0, + 8, 8, 6, 7, 8, 0, 8, 9, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 8, 8, 0, 8, 8, 0, 8, 8, 5, 8, 8, + 0, 8, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 8, 8, 0, 8, 8, 0, 8, 7, 5, 8, 8, 0, 8, 8, 0, 7, + 8, + }; + + static float _vq_quantthresh__44c8_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c8_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p1_0 = { + _vq_quantthresh__44c8_s_p1_0, + _vq_quantmap__44c8_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c8_s_p1_0 = { + 4, 81, + _vq_lengthlist__44c8_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c8_s_p1_0, + NULL, + &_vq_auxt__44c8_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c8_s_p2_0[] = { + 3, 5, 5, 8, 8, 0, 6, 6, 8, 8, 0, 5, 6, 8, 8, 0, + 7, 7, 9, 9, 0, 0, 0, 9, 9, 5, 7, 6, 9, 9, 0, 7, + 7,10, 9, 0, 7, 7,10, 9, 0, 9, 9,11,11, 0, 0, 0, + 11,11, 5, 6, 7, 9, 9, 0, 7, 7, 9,10, 0, 7, 7, 9, + 10, 0, 9, 9,11,11, 0, 0, 0,11,11, 8, 9, 9,11,10, + 0,11,10,12,11, 0,10,10,12,11, 0,13,13,14,13, 0, + 0, 0,14,13, 8, 9, 9,10,11, 0,10,11,11,12, 0,10, + 10,12,12, 0,13,13,13,14, 0, 0, 0,13,14, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 7, 7,10,10, 0, 7, 7,10,10, + 0, 7, 7,10,10, 0, 9, 8,10,10, 0, 0, 0,10,10, 6, + 7, 7,10,10, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 8, + 9,10,10, 0, 0, 0,10,10, 8,10, 9,12,12, 0,10, 9, + 12,11, 0,10,10,11,12, 0,12,11,13,12, 0, 0, 0,13, + 13, 8, 9,10,11,12, 0, 9,10,11,12, 0,10,10,11,12, + 0,11,12,12,13, 0, 0, 0,13,13, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 8, 7,11,10, 0, 7, 7,10,10, 0, 7, 7, + 10, 9, 0, 8, 9,10,10, 0, 0, 0,10,10, 6, 7, 8,10, + 11, 0, 7, 7,10,10, 0, 7, 7,10,10, 0, 9, 8,10,10, + 0, 0, 0,10,10, 8,10, 9,12,11, 0,10,10,12,11, 0, + 10,10,12,11, 0,11,12,13,12, 0, 0, 0,13,12, 9, 9, + 10,11,12, 0,10,10,11,12, 0,10,10,11,12, 0,12,11, + 12,13, 0, 0, 0,12,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 9, 9,12,13, 0, 9, 8,12,11, 0, 8, 9,11,12, 0, + 10, 9,12,11, 0, 0, 0,11,12, 7, 9, 9,13,13, 0, 9, + 9,11,12, 0, 9, 8,12,11, 0, 9,10,11,12, 0, 0, 0, + 12,11, 9,11,11,14,13, 0,10,10,13,12, 0,10,10,13, + 13, 0,12,11,13,12, 0, 0, 0,13,13, 9,11,11,13,14, + 0,10,10,12,13, 0,10,10,13,13, 0,11,12,12,13, 0, + 0, 0,13,13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 11,11,14,13, 0,10,10,13,12, 0,10,10,13,12, 0,11, + 12,13,13, 0, 0, 0,13,12, 9,11,11,13,14, 0,10,10, + 13,13, 0,10,10,12,13, 0,12,11,13,13, 0, 0, 0,12, + 13, + }; + + static float _vq_quantthresh__44c8_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c8_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p2_0 = { + _vq_quantthresh__44c8_s_p2_0, + _vq_quantmap__44c8_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c8_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c8_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c8_s_p2_0, + NULL, + &_vq_auxt__44c8_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c8_s_p3_0[] = { + 3, 3, 4, 5, 5, 7, 6, 8, 8, 0, 4, 4, 5, 5, 7, 7, + 9, 9, 0, 4, 4, 5, 6, 7, 7, 9, 9, 0, 5, 5, 6, 6, + 8, 8,10,10, 0, 0, 0, 6, 6, 8, 8,10,10, 0, 0, 0, + 7, 7, 8, 8,10,10, 0, 0, 0, 7, 7, 8, 8,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c8_s_p3_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c8_s_p3_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p3_0 = { + _vq_quantthresh__44c8_s_p3_0, + _vq_quantmap__44c8_s_p3_0, + 9, + 9 + }; + + static static_codebook _44c8_s_p3_0 = { + 2, 81, + _vq_lengthlist__44c8_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c8_s_p3_0, + NULL, + &_vq_auxt__44c8_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c8_s_p4_0[] = { + 3, 4, 4, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10,10,10, + 10, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,10,10, + 11,11, 0, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10,11, + 10,11,11, 0, 5, 5, 6, 6, 8, 8, 9, 9, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 6, 6, 8, 8, 9, 9, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9,10, + 10,11,11,12,12,12,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 8, 8, 9, + 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c8_s_p4_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c8_s_p4_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p4_0 = { + _vq_quantthresh__44c8_s_p4_0, + _vq_quantmap__44c8_s_p4_0, + 17, + 17 + }; + + static static_codebook _44c8_s_p4_0 = { + 2, 289, + _vq_lengthlist__44c8_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c8_s_p4_0, + NULL, + &_vq_auxt__44c8_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p5_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c8_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6,10,10,10,10, + 10,10, 4, 6, 6,10,10,10,10,10,10, 5,10,10, 9,12, + 12,10,12,12, 7,10,10,12,12,12,12,12,12, 7,10,10, + 12,12,12,12,12,13, 6,10,10,10,12,12,11,12,12, 8, + 10,10,12,13,12,12,12,12, 7,10,10,12,12,13,12,13, + 12, + }; + + static float _vq_quantthresh__44c8_s_p5_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c8_s_p5_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p5_0 = { + _vq_quantthresh__44c8_s_p5_0, + _vq_quantmap__44c8_s_p5_0, + 3, + 3 + }; + + static static_codebook _44c8_s_p5_0 = { + 4, 81, + _vq_lengthlist__44c8_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c8_s_p5_0, + NULL, + &_vq_auxt__44c8_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c8_s_p5_1[] = { + 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 7,10, 4, 4, 6, 6, + 7, 7, 8, 8, 8, 8,10, 5, 5, 6, 6, 7, 7, 8, 8, 8, + 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, + 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, + 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, + 7, 7, 7, 7, 8, 8, 8, 8,11,11,11,11,11, 7, 7, 8, + 8, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 8, 8,11,11, + 11,11,11, 7, 7, 7, 7, 8, 8, + }; + + static float _vq_quantthresh__44c8_s_p5_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c8_s_p5_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p5_1 = { + _vq_quantthresh__44c8_s_p5_1, + _vq_quantmap__44c8_s_p5_1, + 11, + 11 + }; + + static static_codebook _44c8_s_p5_1 = { + 2, 121, + _vq_lengthlist__44c8_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c8_s_p5_1, + NULL, + &_vq_auxt__44c8_s_p5_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c8_s_p6_0[] = { + 1, 4, 4, 7, 6, 8, 8, 9, 9,10,10,11,11, 5, 5, 5, + 7, 7, 9, 9,10, 9,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9,10,10,11,11,12,12, 0, 6, 6, 7, 7, 9, 9,10,10, + 11,11,12,12, 0, 7, 7, 7, 7, 9, 9,10,10,12,12,12, + 12, 0,10,10, 8, 8,10,10,11,11,12,12,13,13, 0,11, + 11, 8, 8,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + static float _vq_quantthresh__44c8_s_p6_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c8_s_p6_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p6_0 = { + _vq_quantthresh__44c8_s_p6_0, + _vq_quantmap__44c8_s_p6_0, + 13, + 13 + }; + + static static_codebook _44c8_s_p6_0 = { + 2, 169, + _vq_lengthlist__44c8_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c8_s_p6_0, + NULL, + &_vq_auxt__44c8_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c8_s_p6_1[] = { + 3, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 6, + 5, 5, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__44c8_s_p6_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c8_s_p6_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p6_1 = { + _vq_quantthresh__44c8_s_p6_1, + _vq_quantmap__44c8_s_p6_1, + 5, + 5 + }; + + static static_codebook _44c8_s_p6_1 = { + 2, 25, + _vq_lengthlist__44c8_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c8_s_p6_1, + NULL, + &_vq_auxt__44c8_s_p6_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c8_s_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 5, 5, 5, + 7, 7, 9, 9,10,10,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9,10,10,11,11,12,12,20, 6, 7, 7, 7, 9, 9,10,10, + 11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10,11,11,12, + 12,20,11,11, 8, 8,10,10,11,11,12,12,12,12,20,12, + 12, 8, 8,10, 9,11,11,12,12,13,13,20,20,20,11,10, + 10,10,11,11,12,12,13,13,20,20,20,10,11,10,10,11, + 11,12,12,13,13,20,20,20,14,15,11,11,12,12,13,13, + 14,13,20,20,20,15,15,11,11,12,12,13,13,14,14,20, + 20,20,20,19,13,13,12,12,13,13,14,14,19,19,19,19, + 19,13,13,12,12,13,13,14,14, + }; + + static float _vq_quantthresh__44c8_s_p7_0[] = { + -60.5, -49.5, -38.5, -27.5, -16.5, -5.5, 5.5, 16.5, + 27.5, 38.5, 49.5, 60.5, + }; + + static long _vq_quantmap__44c8_s_p7_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p7_0 = { + _vq_quantthresh__44c8_s_p7_0, + _vq_quantmap__44c8_s_p7_0, + 13, + 13 + }; + + static static_codebook _44c8_s_p7_0 = { + 2, 169, + _vq_lengthlist__44c8_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + _vq_quantlist__44c8_s_p7_0, + NULL, + &_vq_auxt__44c8_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c8_s_p7_1[] = { + 4, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 5, 5, 7, 7, + 7, 7, 7, 7, 7, 7, 8, 5, 5, 7, 7, 7, 7, 7, 7, 7, + 7, 8, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, + 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 7, 7, 7, 7, 7, 7, + }; + + static float _vq_quantthresh__44c8_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c8_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p7_1 = { + _vq_quantthresh__44c8_s_p7_1, + _vq_quantmap__44c8_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c8_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c8_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c8_s_p7_1, + NULL, + &_vq_auxt__44c8_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c8_s_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11,11, 6, + 5, 5, 7, 7, 9, 9, 8, 8,10,10,11,11,11,12, 6, 5, + 5, 7, 7, 9, 9, 9, 8,10,10,11,10,11,12,18, 8, 8, + 8, 8, 9, 9, 9, 9,10,10,11,11,12,12,18, 8, 8, 8, + 8, 9, 9, 9, 9,10,10,11,11,12,13,18,12,12, 9, 9, + 10,10, 9, 9,10,11,11,12,13,12,18,12,12, 9, 9,10, + 10,10,10,10,11,11,12,13,13,18,18,18, 9, 9, 9, 9, + 10,10,11,11,12,12,12,12,18,18,18, 9, 9, 9, 9,10, + 10,11,11,12,12,13,13,18,18,18,13,13,10,10,11,11, + 12,11,12,12,13,13,18,18,18,14,14,10, 9,11,10,12, + 12,12,12,13,13,18,18,18,18,18,11,12,11,11,12,12, + 13,13,14,13,18,18,18,18,18,12,11,11,10,12,11,13, + 13,13,14,18,18,18,18,18,15,16,12,12,12,13,13,13, + 14,14,18,17,17,17,17,16,14,12,11,12,11,13,12,15, + 14, + }; + + static float _vq_quantthresh__44c8_s_p8_0[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__44c8_s_p8_0[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p8_0 = { + _vq_quantthresh__44c8_s_p8_0, + _vq_quantmap__44c8_s_p8_0, + 15, + 15 + }; + + static static_codebook _44c8_s_p8_0 = { + 2, 225, + _vq_lengthlist__44c8_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__44c8_s_p8_0, + NULL, + &_vq_auxt__44c8_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__44c8_s_p8_1[] = { + 4, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 7, 7, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,11, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,11,11,10,11,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 9,10, + 9, 9,10,11,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,11,10,10, 9, 9, 9, 9, + 9, 9, 9, 9,10, 9, 9, 9, 9, 9, 9, 9,11,10,11,10, + 10,10,10, 9, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, 9, + 9,11,11,11,10,10,11,10, 9, 9, 9, 9, 9, 9,10,10, + 9, 9, 9, 9, 9, 9,10,11,10,10,10,11,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10, 9,10, 9,11,11,10,10,10, + 10,10, 9, 9, 9,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,11,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,11,11,10,11,10,10,10,10,10,10, 9, + 10, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10,10, + 10,10,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, + 9, 9,10, 9,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9,10, 9, 9,10, 9, 9, + }; + + static float _vq_quantthresh__44c8_s_p8_1[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__44c8_s_p8_1[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p8_1 = { + _vq_quantthresh__44c8_s_p8_1, + _vq_quantmap__44c8_s_p8_1, + 21, + 21 + }; + + static static_codebook _44c8_s_p8_1 = { + 2, 441, + _vq_lengthlist__44c8_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__44c8_s_p8_1, + NULL, + &_vq_auxt__44c8_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p9_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c8_s_p9_0[] = { + 1, 5, 5,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10, 7,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 6, 8,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, + }; + + static float _vq_quantthresh__44c8_s_p9_0[] = { + -6982.5, -6051.5, -5120.5, -4189.5, -3258.5, -2327.5, -1396.5, -465.5, + 465.5, 1396.5, 2327.5, 3258.5, 4189.5, 5120.5, 6051.5, 6982.5, + }; + + static long _vq_quantmap__44c8_s_p9_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p9_0 = { + _vq_quantthresh__44c8_s_p9_0, + _vq_quantmap__44c8_s_p9_0, + 17, + 17 + }; + + static static_codebook _44c8_s_p9_0 = { + 2, 289, + _vq_lengthlist__44c8_s_p9_0, + 1, -509798400, 1631393792, 5, 0, + _vq_quantlist__44c8_s_p9_0, + NULL, + &_vq_auxt__44c8_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, + }; + + static long _vq_lengthlist__44c8_s_p9_1[] = { + 1, 4, 4, 7, 7, 7, 7, 7, 7, 9, 9,10,10,11,10,13, + 12,11,12, 6, 6, 6, 8, 8, 8, 8, 8, 8, 9,10,10,10, + 12,12,12,12,13,15, 5, 5, 5, 8, 8, 8, 8, 8, 8,10, + 9,10,11,12,13,12,13,13,12,15, 9, 8, 9, 9, 9, 9, + 9, 9,10,10,10,11,14,12,13,15,12,14,15, 8, 9, 9, + 9, 9, 9, 9, 9,10,10,12,11,12,11,12,13,13,13,15, + 13,13, 9, 9,10, 9,10,10,11,10,11,12,12,12,14,13, + 14,15,15,13,13, 9, 8,10, 9,10,10,11,10,12,12,13, + 13,14,13,14,15,15,15,15, 9, 9, 9, 9,10,11,12,12, + 12,13,13,13,14,15,15,14,15,15,15, 9, 7, 9, 8,12, + 11,11,13,12,12,13,12,14,13,13,14,15,15,15,13,13, + 10,10,12,11,13,13,12,12,13,13,14,13,13,15,15,15, + 15,12,13,11, 9,11,10,12,12,15,13,13,13,14,13,14, + 13,15,15,15,15,15,12,12,11,11,12,13,15,13,13,14, + 14,14,15,14,15,15,15,15,15,13,11,12,11,12,11,13, + 14,13,13,14,14,13,14,15,15,15,15,15,15,15,12,12, + 12,13,15,13,15,14,15,14,13,15,15,15,15,15,15,14, + 15,13,13,12,11,14,12,15,13,14,14,14,13,15,15,15, + 15,15,15,15,14,13,14,13,15,13,15,15,15,14,15,14, + 15,15,15,15,15,15,15,14,14,14,13,13,13,15,15,15, + 15,14,15,15,15,15,15,15,15,15,15,15,12,13,13,13, + 14,15,15,13,15,15,15,15,15,15,15,15,15,15,15,15, + 15,14,14,15,15,15,14,14,15, + }; + + static float _vq_quantthresh__44c8_s_p9_1[] = { + -416.5, -367.5, -318.5, -269.5, -220.5, -171.5, -122.5, -73.5, + -24.5, 24.5, 73.5, 122.5, 171.5, 220.5, 269.5, 318.5, + 367.5, 416.5, + }; + + static long _vq_quantmap__44c8_s_p9_1[] = { + 17, 15, 13, 11, 9, 7, 5, 3, + 1, 0, 2, 4, 6, 8, 10, 12, + 14, 16, 18, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p9_1 = { + _vq_quantthresh__44c8_s_p9_1, + _vq_quantmap__44c8_s_p9_1, + 19, + 19 + }; + + static static_codebook _44c8_s_p9_1 = { + 2, 361, + _vq_lengthlist__44c8_s_p9_1, + 1, -518287360, 1622704128, 5, 0, + _vq_quantlist__44c8_s_p9_1, + NULL, + &_vq_auxt__44c8_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c8_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, + }; + + static long _vq_lengthlist__44c8_s_p9_2[] = { + 3, 4, 3, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 6, 7, 6, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + }; + + static float _vq_quantthresh__44c8_s_p9_2[] = { + -23.5, -22.5, -21.5, -20.5, -19.5, -18.5, -17.5, -16.5, + -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, -9.5, -8.5, + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, + 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, + }; + + static long _vq_quantmap__44c8_s_p9_2[] = { + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, + 48, + }; + + static encode_aux_threshmatch _vq_auxt__44c8_s_p9_2 = { + _vq_quantthresh__44c8_s_p9_2, + _vq_quantmap__44c8_s_p9_2, + 49, + 49 + }; + + static static_codebook _44c8_s_p9_2 = { + 1, 49, + _vq_lengthlist__44c8_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + _vq_quantlist__44c8_s_p9_2, + NULL, + &_vq_auxt__44c8_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c8_s_short[] = { + 4,11,13,14,16,15,16,16,17,16, 5, 6, 8, 9,10, 9, + 11,17,16,17, 6, 6, 6, 6, 7, 8, 9,14,16,17, 8, 6, + 5, 4, 6, 7, 9,12,14,17, 9, 7, 6, 5, 5, 5, 8,11, + 14,17,10, 9, 7, 6, 5, 3, 5, 8,13,17,12,11, 9, 8, + 7, 4, 4, 6,14,17,13,13,12, 8, 7, 5, 4, 5,12,17, + 17,14,15,10, 8, 7, 7, 7,11,17,17,16,17,14,12,10, + 11,11,15,17, + }; + + static static_codebook _huff_book__44c8_s_short = { + 2, 100, + _huff_lengthlist__44c8_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _huff_lengthlist__44c9_s_long[] = { + 3, 8,13,14,15,15,13,13,14,14, 6, 5, 8,10,12,12, + 13,12,13,14,10, 6, 5, 6, 8, 9,11,11,13,14,13, 8, + 5, 4, 5, 6, 9,10,13,14,14,11, 7, 5, 4, 5, 8, 9, + 12,14,12,11, 8, 6, 5, 3, 5, 7,10,13,12,10,10, 8, + 7, 5, 4, 6, 9,12,13,12,11,10, 9, 6, 5, 5, 7,10, + 13,12,12,11,11, 9, 8, 7, 8,10,12,12,13,13,14,12, + 10, 9, 9,10, + }; + + static static_codebook _huff_book__44c9_s_long = { + 2, 100, + _huff_lengthlist__44c9_s_long, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c9_s_p1_0[] = { + 1, 5, 5, 0, 5, 5, 0, 5, 5, 6, 8, 8, 0, 9, 8, 0, + 8, 8, 6, 8, 8, 0, 8, 9, 0, 8, 8, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 5, 8, 8, 0, 8, 7, 0, 8, 8, 5, 8, 8, + 0, 7, 8, 0, 8, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, + 9, 8, 0, 8, 8, 0, 7, 7, 5, 8, 9, 0, 8, 8, 0, 7, + 7, + }; + + static float _vq_quantthresh__44c9_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__44c9_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p1_0 = { + _vq_quantthresh__44c9_s_p1_0, + _vq_quantmap__44c9_s_p1_0, + 3, + 3 + }; + + static static_codebook _44c9_s_p1_0 = { + 4, 81, + _vq_lengthlist__44c9_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__44c9_s_p1_0, + NULL, + &_vq_auxt__44c9_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c9_s_p2_0[] = { + 3, 6, 6, 8, 8, 0, 6, 6, 8, 8, 0, 5, 5, 8, 8, 0, + 7, 7, 9, 9, 0, 0, 0, 9, 9, 6, 7, 7, 9, 8, 0, 8, + 7, 9, 9, 0, 7, 7, 9, 9, 0, 9, 9,11,10, 0, 0, 0, + 10,10, 6, 7, 7, 8, 9, 0, 7, 8, 9, 9, 0, 7, 7, 9, + 9, 0, 9, 9,10,11, 0, 0, 0,10,10, 8, 9, 9,10,10, + 0,10,10,11,11, 0,10,10,11,11, 0,12,12,13,12, 0, + 0, 0,13,13, 8, 8, 9,10,10, 0,10,10,11,12, 0,10, + 10,11,11, 0,12,12,13,13, 0, 0, 0,13,13, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 6, 8, 7,10,10, 0, 7, 7,10, 9, + 0, 7, 7,10,10, 0, 9, 8,10,10, 0, 0, 0,10,10, 6, + 7, 7,10,10, 0, 7, 7, 9,10, 0, 7, 7,10,10, 0, 8, + 9,10,10, 0, 0, 0,10,10, 8, 9, 9,11,11, 0,10, 9, + 11,11, 0,10,10,11,11, 0,11,11,12,12, 0, 0, 0,12, + 12, 8, 9, 9,11,11, 0, 9,10,11,11, 0,10,10,11,11, + 0,11,11,12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 5, 8, 7,10,10, 0, 7, 7,10,10, 0, 7, 7, + 10, 9, 0, 8, 9,10,10, 0, 0, 0,10, 9, 5, 7, 8,10, + 10, 0, 7, 7,10,10, 0, 7, 7, 9,10, 0, 9, 8,10,10, + 0, 0, 0,10,10, 8, 9, 9,12,11, 0,10,10,11,11, 0, + 10, 9,11,11, 0,11,11,12,12, 0, 0, 0,12,12, 8, 9, + 9,11,11, 0,10,10,11,11, 0, 9,10,11,11, 0,11,11, + 12,12, 0, 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 7, 9, 9,12,12, 0, 9, 9,11,11, 0, 8, 9,11,11, 0, + 10, 9,12,11, 0, 0, 0,11,11, 7, 9, 9,12,12, 0, 8, + 9,11,11, 0, 9, 8,11,11, 0, 9,10,11,11, 0, 0, 0, + 11,11, 9,11,11,13,13, 0,10,10,12,12, 0,10,10,12, + 12, 0,12,11,12,12, 0, 0, 0,13,13, 9,10,11,13,13, + 0,10,10,12,12, 0,10,10,12,12, 0,11,11,12,12, 0, + 0, 0,12,12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, + 11,10,13,13, 0,10,10,12,12, 0,10, 9,12,12, 0,11, + 11,12,13, 0, 0, 0,12,11, 9,10,10,12,13, 0,10,10, + 12,12, 0,10,10,12,12, 0,11,11,13,12, 0, 0, 0,12, + 12, + }; + + static float _vq_quantthresh__44c9_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c9_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p2_0 = { + _vq_quantthresh__44c9_s_p2_0, + _vq_quantmap__44c9_s_p2_0, + 5, + 5 + }; + + static static_codebook _44c9_s_p2_0 = { + 4, 625, + _vq_lengthlist__44c9_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c9_s_p2_0, + NULL, + &_vq_auxt__44c9_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p3_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__44c9_s_p3_0[] = { + 3, 4, 4, 5, 5, 6, 6, 8, 8, 0, 4, 4, 5, 5, 7, 6, + 8, 8, 0, 4, 4, 5, 5, 7, 7, 8, 8, 0, 5, 5, 6, 6, + 7, 7, 9, 9, 0, 0, 0, 6, 6, 7, 7, 9, 9, 0, 0, 0, + 7, 7, 8, 8, 9, 9, 0, 0, 0, 7, 7, 8, 8, 9, 9, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c9_s_p3_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__44c9_s_p3_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p3_0 = { + _vq_quantthresh__44c9_s_p3_0, + _vq_quantmap__44c9_s_p3_0, + 9, + 9 + }; + + static static_codebook _44c9_s_p3_0 = { + 2, 81, + _vq_lengthlist__44c9_s_p3_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__44c9_s_p3_0, + NULL, + &_vq_auxt__44c9_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p4_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__44c9_s_p4_0[] = { + 4, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 8, 8, 9, 9,10, + 10, 0, 5, 5, 5, 5, 6, 6, 8, 7, 8, 8, 9, 9,10,10, + 11,11, 0, 5, 5, 5, 5, 7, 7, 8, 8, 8, 8, 9, 9,10, + 10,11,11, 0, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 6, 6, 7, 7, 8, 8, 9, 9,10, + 10,11,11,12,12, 0, 0, 0, 7, 7, 7, 7, 9, 9, 9, 9, + 11,11,11,11,12,12, 0, 0, 0, 7, 7, 7, 8, 9, 9, 9, + 9,11,10,11,11,12,12, 0, 0, 0, 7, 7, 7, 7, 9, 9, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 7, 7, 9, + 9,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__44c9_s_p4_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__44c9_s_p4_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p4_0 = { + _vq_quantthresh__44c9_s_p4_0, + _vq_quantmap__44c9_s_p4_0, + 17, + 17 + }; + + static static_codebook _44c9_s_p4_0 = { + 2, 289, + _vq_lengthlist__44c9_s_p4_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__44c9_s_p4_0, + NULL, + &_vq_auxt__44c9_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p5_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__44c9_s_p5_0[] = { + 1, 4, 4, 5, 7, 7, 6, 7, 7, 4, 6, 6,10,10,10,10, + 10,10, 4, 6, 6,10,10,10,10,10,10, 5,10,10, 9,12, + 12,10,12,12, 7,10,10,12,12,12,12,12,13, 7,10,10, + 12,12,12,12,13,13, 6,10,10,10,12,12,11,12,12, 8, + 10,10,12,12,12,12,12,12, 7,10,10,12,12,13,12,12, + 12, + }; + + static float _vq_quantthresh__44c9_s_p5_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__44c9_s_p5_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p5_0 = { + _vq_quantthresh__44c9_s_p5_0, + _vq_quantmap__44c9_s_p5_0, + 3, + 3 + }; + + static static_codebook _44c9_s_p5_0 = { + 4, 81, + _vq_lengthlist__44c9_s_p5_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__44c9_s_p5_0, + NULL, + &_vq_auxt__44c9_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p5_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c9_s_p5_1[] = { + 4, 5, 5, 6, 6, 6, 7, 7, 7, 7, 7,10, 5, 5, 6, 6, + 7, 7, 7, 7, 8, 8,10, 5, 5, 6, 6, 7, 7, 7, 7, 8, + 8,11, 5, 5, 6, 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, + 6, 7, 7, 8, 8, 8, 8,11,11,11, 6, 6, 7, 7, 8, 8, + 8, 8,11,11,11, 6, 6, 7, 7, 7, 7, 8, 8,11,11,11, + 7, 7, 7, 7, 7, 7, 8, 8,11,11,11,11,11, 7, 7, 7, + 7, 8, 8,11,11,11,11,11, 7, 7, 7, 7, 7, 7,11,11, + 11,11,11, 7, 7, 7, 7, 7, 7, + }; + + static float _vq_quantthresh__44c9_s_p5_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c9_s_p5_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p5_1 = { + _vq_quantthresh__44c9_s_p5_1, + _vq_quantmap__44c9_s_p5_1, + 11, + 11 + }; + + static static_codebook _44c9_s_p5_1 = { + 2, 121, + _vq_lengthlist__44c9_s_p5_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c9_s_p5_1, + NULL, + &_vq_auxt__44c9_s_p5_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p6_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c9_s_p6_0[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 9, 9,10,10, 5, 4, 4, + 6, 6, 8, 8, 9, 9,10,10,11,11, 6, 4, 4, 6, 6, 8, + 8, 9, 9,10,10,12,12, 0, 6, 6, 6, 6, 8, 8,10,10, + 11,11,12,12, 0, 6, 6, 6, 6, 8, 8,10,10,11,11,12, + 12, 0,10,10, 8, 8, 9, 9,11,11,12,12,13,13, 0,11, + 11, 8, 8, 9,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, + }; + + static float _vq_quantthresh__44c9_s_p6_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__44c9_s_p6_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p6_0 = { + _vq_quantthresh__44c9_s_p6_0, + _vq_quantmap__44c9_s_p6_0, + 13, + 13 + }; + + static static_codebook _44c9_s_p6_0 = { + 2, 169, + _vq_lengthlist__44c9_s_p6_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__44c9_s_p6_0, + NULL, + &_vq_auxt__44c9_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p6_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__44c9_s_p6_1[] = { + 4, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, 4, 4, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, + }; + + static float _vq_quantthresh__44c9_s_p6_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__44c9_s_p6_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p6_1 = { + _vq_quantthresh__44c9_s_p6_1, + _vq_quantmap__44c9_s_p6_1, + 5, + 5 + }; + + static static_codebook _44c9_s_p6_1 = { + 2, 25, + _vq_lengthlist__44c9_s_p6_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__44c9_s_p6_1, + NULL, + &_vq_auxt__44c9_s_p6_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p7_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__44c9_s_p7_0[] = { + 1, 4, 4, 7, 7, 8, 8, 9, 9,10,10,11,11, 6, 5, 5, + 7, 7, 9, 8,10,10,11,11,12,12, 6, 5, 5, 7, 7, 9, + 9,10,10,11,11,12,12,20, 6, 6, 7, 7, 9, 9,10,10, + 11,11,12,12,20, 7, 7, 7, 7, 9, 9,10,10,11,11,13, + 12,20,10,10, 8, 8, 9, 9,11,11,12,12,13,13,20,11, + 11, 8, 8, 9, 9,11,11,12,12,13,13,20,20,20,10,10, + 10,10,11,11,12,12,13,13,20,20,20,10,10,10,10,11, + 11,12,12,13,13,20,20,20,14,14,11,11,12,12,13,13, + 14,13,20,20,20,14,15,11,11,11,11,13,13,14,13,20, + 20,20,20,19,12,12,12,12,13,13,14,14,19,19,19,19, + 19,13,13,12,12,13,13,14,14, + }; + + static float _vq_quantthresh__44c9_s_p7_0[] = { + -60.5, -49.5, -38.5, -27.5, -16.5, -5.5, 5.5, 16.5, + 27.5, 38.5, 49.5, 60.5, + }; + + static long _vq_quantmap__44c9_s_p7_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p7_0 = { + _vq_quantthresh__44c9_s_p7_0, + _vq_quantmap__44c9_s_p7_0, + 13, + 13 + }; + + static static_codebook _44c9_s_p7_0 = { + 2, 169, + _vq_lengthlist__44c9_s_p7_0, + 1, -523206656, 1618345984, 4, 0, + _vq_quantlist__44c9_s_p7_0, + NULL, + &_vq_auxt__44c9_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__44c9_s_p7_1[] = { + 5, 6, 6, 6, 6, 7, 6, 7, 7, 7, 7, 8, 6, 6, 6, 6, + 7, 7, 7, 7, 7, 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, + 7, 8, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 6, + 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, + 7, 7, 8, 8, 8, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, + 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, + 7, 7, 7, 8, 8, 8, 8, 8, 7, 7, 7, 7, 7, 7, 8, 8, + 8, 8, 8, 7, 7, 7, 7, 7, 7, + }; + + static float _vq_quantthresh__44c9_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__44c9_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p7_1 = { + _vq_quantthresh__44c9_s_p7_1, + _vq_quantmap__44c9_s_p7_1, + 11, + 11 + }; + + static static_codebook _44c9_s_p7_1 = { + 2, 121, + _vq_lengthlist__44c9_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__44c9_s_p7_1, + NULL, + &_vq_auxt__44c9_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p8_0[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__44c9_s_p8_0[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8, 9, 9,10,10,11,11, 6, + 5, 5, 7, 7, 9, 9, 8, 9,10,10,11,11,12,12, 6, 5, + 5, 7, 7, 9, 9, 9, 9,10,10,11,11,12,12,19, 7, 8, + 8, 8, 9, 9, 9, 9,10,10,11,11,12,13,19, 8, 8, 8, + 8, 9, 9, 9, 9,10,10,11,12,12,12,19,12,12, 9, 9, + 9,10, 9,10,10,10,12,12,12,12,19,12,12, 9, 9,10, + 9,10,10,11,11,12,11,13,13,19,19,19, 9, 9, 9, 9, + 10,10,11,11,12,12,12,12,19,19,19, 9, 9, 9, 9,10, + 10,11,11,12,12,13,13,19,19,19,13,13,10,10,10,10, + 12,12,12,12,13,13,19,19,19,13,13,10,10,10,10,12, + 12,12,12,13,13,19,19,19,19,19,11,12,11,11,12,12, + 13,12,13,13,19,19,19,18,18,12,11,11,10,12,11,13, + 13,13,14,18,18,18,18,18,15,16,12,12,13,12,13,13, + 14,14,18,18,18,18,18,16,15,12,11,12,11,13,13,14, + 14, + }; + + static float _vq_quantthresh__44c9_s_p8_0[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__44c9_s_p8_0[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p8_0 = { + _vq_quantthresh__44c9_s_p8_0, + _vq_quantmap__44c9_s_p8_0, + 15, + 15 + }; + + static static_codebook _44c9_s_p8_0 = { + 2, 225, + _vq_lengthlist__44c9_s_p8_0, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__44c9_s_p8_0, + NULL, + &_vq_auxt__44c9_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p8_1[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__44c9_s_p8_1[] = { + 4, 6, 6, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, + 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, 8, 8, 8, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, 6, 6, 7, 7, 8, + 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10, 7, 8, 8, 8, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9,10,10,10, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10, + 10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10, + 10,10,10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9,10,10,10,10,10,10,10, 9, 9, 9, 9,10,10,10,10, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10,10,10,10, + 10,10, 9, 9, 9, 9, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, + 10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10, 9, 9, 9,10, 9, 9, 9, 9,10,10,10,10,10,10, + 10,10,10, 9,10, 9, 9, 9, 9, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,10,10,10, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + }; + + static float _vq_quantthresh__44c9_s_p8_1[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__44c9_s_p8_1[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p8_1 = { + _vq_quantthresh__44c9_s_p8_1, + _vq_quantmap__44c9_s_p8_1, + 21, + 21 + }; + + static static_codebook _44c9_s_p8_1 = { + 2, 441, + _vq_lengthlist__44c9_s_p8_1, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__44c9_s_p8_1, + NULL, + &_vq_auxt__44c9_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p9_0[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, + }; + + static long _vq_lengthlist__44c9_s_p9_0[] = { + 1, 4, 4,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10, 7, 9,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10, 7, 9,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, + }; + + static float _vq_quantthresh__44c9_s_p9_0[] = { + -7913.5, -6982.5, -6051.5, -5120.5, -4189.5, -3258.5, -2327.5, -1396.5, + -465.5, 465.5, 1396.5, 2327.5, 3258.5, 4189.5, 5120.5, 6051.5, + 6982.5, 7913.5, + }; + + static long _vq_quantmap__44c9_s_p9_0[] = { + 17, 15, 13, 11, 9, 7, 5, 3, + 1, 0, 2, 4, 6, 8, 10, 12, + 14, 16, 18, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p9_0 = { + _vq_quantthresh__44c9_s_p9_0, + _vq_quantmap__44c9_s_p9_0, + 19, + 19 + }; + + static static_codebook _44c9_s_p9_0 = { + 2, 361, + _vq_lengthlist__44c9_s_p9_0, + 1, -508535424, 1631393792, 5, 0, + _vq_quantlist__44c9_s_p9_0, + NULL, + &_vq_auxt__44c9_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p9_1[] = { + 9, + 8, + 10, + 7, + 11, + 6, + 12, + 5, + 13, + 4, + 14, + 3, + 15, + 2, + 16, + 1, + 17, + 0, + 18, + }; + + static long _vq_lengthlist__44c9_s_p9_1[] = { + 1, 4, 4, 7, 7, 8, 8, 8, 8, 9,10,10,10,12,11,12, + 13,13,12, 6, 5, 5, 8, 8, 8, 9, 8, 9,10,10,11,11, + 12,12,14,13,13,12, 5, 5, 5, 8, 8, 9, 8, 8, 9,10, + 10,11,11,12,12,14,12,13,13,16, 8, 8, 9, 9, 9, 9, + 9, 9,10,10,11,12,13,13,13,13,14,14,16, 8, 8, 9, + 9, 9, 9, 9, 9,11,11,12,11,13,13,14,13,13,13,16, + 14,13, 9, 9, 9, 9,10,10,11,12,12,13,13,13,14,13, + 15,14,16,13,13, 9, 8, 9, 9,10,10,12,11,13,13,14, + 14,14,14,15,14,16,16,16, 9, 9, 9, 9,10,10,12,12, + 12,13,13,13,15,13,15,15,16,16,16, 9, 7, 9, 8,10, + 11,11,12,12,13,13,16,15,14,14,14,16,16,16,13,13, + 10,10,11,11,13,15,13,14,13,14,14,13,14,14,16,16, + 16,13,12,10, 9,11,11,12,12,14,14,13,14,14,14,14, + 14,16,16,16,16,16,12,13,11,11,12,13,13,13,14,15, + 14,14,16,15,16,16,16,16,16,12,11,12,12,15,13,13, + 13,14,13,15,14,15,14,16,16,16,16,16,14,15,12,13, + 13,12,14,15,15,14,15,14,15,13,16,16,16,16,16,16, + 16,13,13,14,12,16,12,16,15,14,15,14,14,16,16,16, + 16,16,16,16,15,14,14,14,15,16,16,16,16,14,16,16, + 16,16,16,16,16,16,16,14,14,14,12,15,11,15,13,16, + 15,16,15,16,16,16,16,16,16,16,15,16,14,14,15,13, + 15,16,16,16,16,15,16,16,16,16,16,16,16,16,16,15, + 15,14,13,14,16,16,14,15,16, + }; + + static float _vq_quantthresh__44c9_s_p9_1[] = { + -416.5, -367.5, -318.5, -269.5, -220.5, -171.5, -122.5, -73.5, + -24.5, 24.5, 73.5, 122.5, 171.5, 220.5, 269.5, 318.5, + 367.5, 416.5, + }; + + static long _vq_quantmap__44c9_s_p9_1[] = { + 17, 15, 13, 11, 9, 7, 5, 3, + 1, 0, 2, 4, 6, 8, 10, 12, + 14, 16, 18, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p9_1 = { + _vq_quantthresh__44c9_s_p9_1, + _vq_quantmap__44c9_s_p9_1, + 19, + 19 + }; + + static static_codebook _44c9_s_p9_1 = { + 2, 361, + _vq_lengthlist__44c9_s_p9_1, + 1, -518287360, 1622704128, 5, 0, + _vq_quantlist__44c9_s_p9_1, + NULL, + &_vq_auxt__44c9_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__44c9_s_p9_2[] = { + 24, + 23, + 25, + 22, + 26, + 21, + 27, + 20, + 28, + 19, + 29, + 18, + 30, + 17, + 31, + 16, + 32, + 15, + 33, + 14, + 34, + 13, + 35, + 12, + 36, + 11, + 37, + 10, + 38, + 9, + 39, + 8, + 40, + 7, + 41, + 6, + 42, + 5, + 43, + 4, + 44, + 3, + 45, + 2, + 46, + 1, + 47, + 0, + 48, + }; + + static long _vq_lengthlist__44c9_s_p9_2[] = { + 3, 4, 4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 7, 6, 6, 7, 7, 6, 7, 6, 7, 7, 7, 7, 7, 7, 7, + 7, + }; + + static float _vq_quantthresh__44c9_s_p9_2[] = { + -23.5, -22.5, -21.5, -20.5, -19.5, -18.5, -17.5, -16.5, + -15.5, -14.5, -13.5, -12.5, -11.5, -10.5, -9.5, -8.5, + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + 8.5, 9.5, 10.5, 11.5, 12.5, 13.5, 14.5, 15.5, + 16.5, 17.5, 18.5, 19.5, 20.5, 21.5, 22.5, 23.5, + }; + + static long _vq_quantmap__44c9_s_p9_2[] = { + 47, 45, 43, 41, 39, 37, 35, 33, + 31, 29, 27, 25, 23, 21, 19, 17, + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, 18, 20, 22, 24, 26, 28, 30, + 32, 34, 36, 38, 40, 42, 44, 46, + 48, + }; + + static encode_aux_threshmatch _vq_auxt__44c9_s_p9_2 = { + _vq_quantthresh__44c9_s_p9_2, + _vq_quantmap__44c9_s_p9_2, + 49, + 49 + }; + + static static_codebook _44c9_s_p9_2 = { + 1, 49, + _vq_lengthlist__44c9_s_p9_2, + 1, -526909440, 1611661312, 6, 0, + _vq_quantlist__44c9_s_p9_2, + NULL, + &_vq_auxt__44c9_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__44c9_s_short[] = { + 5,13,17,15,16,16,18,17,18,18, 5, 7,10,12,12,12, + 12,17,18,17, 7, 6, 7, 8, 9, 9, 9,13,17,17, 8, 6, + 6, 5, 6, 7, 8,11,16,18, 9, 7, 7, 5, 5, 6, 7,10, + 15,18, 9, 8, 7, 6, 5, 4, 5, 7,13,17,11,11, 9, 8, + 7, 4, 3, 5,12,18,13,13,12,10, 7, 5, 4, 3, 8,13, + 16,16,16,13, 8, 8, 7, 5, 8,12,15,18,17,15,11,10, + 9, 8,10,14, + }; + + static static_codebook _huff_book__44c9_s_short = { + 2, 100, + _huff_lengthlist__44c9_s_short, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__8c0_s_p1_0[] = { + 1, 5, 4, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8,10,10, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,10, 9, 0, 0, 0, + 0, 0, 0, 8, 9,11, 0, 0, 0, 0, 0, 0, 9,11,11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9,10, 0, 0, + 0, 0, 0, 0, 9,11,10, 0, 0, 0, 0, 0, 0, 9,11,11, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,11,11, 0, + 0, 0, 0, 0, 0, 9,10,11, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9,10, 0, 0, 0, 0, 0, 0, 9,11,11, + 0, 0, 0, 0, 0, 0, 8,11, 9, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c0_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__8c0_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p1_0 = { + _vq_quantthresh__8c0_s_p1_0, + _vq_quantmap__8c0_s_p1_0, + 3, + 3 + }; + + static static_codebook _8c0_s_p1_0 = { + 8, 6561, + _vq_lengthlist__8c0_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__8c0_s_p1_0, + NULL, + &_vq_auxt__8c0_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__8c0_s_p2_0[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c0_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__8c0_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p2_0 = { + _vq_quantthresh__8c0_s_p2_0, + _vq_quantmap__8c0_s_p2_0, + 5, + 5 + }; + + static static_codebook _8c0_s_p2_0 = { + 4, 625, + _vq_lengthlist__8c0_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__8c0_s_p2_0, + NULL, + &_vq_auxt__8c0_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__8c0_s_p3_0[] = { + 1, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 7, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 5, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 7, 8, 8, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 7, 7, 8, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c0_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__8c0_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p3_0 = { + _vq_quantthresh__8c0_s_p3_0, + _vq_quantmap__8c0_s_p3_0, + 5, + 5 + }; + + static static_codebook _8c0_s_p3_0 = { + 4, 625, + _vq_lengthlist__8c0_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__8c0_s_p3_0, + NULL, + &_vq_auxt__8c0_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__8c0_s_p4_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c0_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__8c0_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p4_0 = { + _vq_quantthresh__8c0_s_p4_0, + _vq_quantmap__8c0_s_p4_0, + 9, + 9 + }; + + static static_codebook _8c0_s_p4_0 = { + 2, 81, + _vq_lengthlist__8c0_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__8c0_s_p4_0, + NULL, + &_vq_auxt__8c0_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__8c0_s_p5_0[] = { + 1, 3, 3, 5, 5, 7, 6, 8, 8, 0, 0, 0, 7, 7, 7, 7, + 8, 8, 0, 0, 0, 7, 7, 7, 7, 8, 9, 0, 0, 0, 8, 8, + 8, 8, 9, 9, 0, 0, 0, 8, 8, 8, 8, 9, 9, 0, 0, 0, + 9, 9, 8, 8,10,10, 0, 0, 0, 9, 9, 8, 8,10,10, 0, + 0, 0,10,10, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, + }; + + static float _vq_quantthresh__8c0_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__8c0_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p5_0 = { + _vq_quantthresh__8c0_s_p5_0, + _vq_quantmap__8c0_s_p5_0, + 9, + 9 + }; + + static static_codebook _8c0_s_p5_0 = { + 2, 81, + _vq_lengthlist__8c0_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__8c0_s_p5_0, + NULL, + &_vq_auxt__8c0_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__8c0_s_p6_0[] = { + 1, 3, 3, 6, 6, 8, 8, 9, 9, 8, 8,10, 9,10,10,11, + 11, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11,11, + 11,12, 0, 0, 0, 7, 7, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,11, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,10,10, + 11,11,12,12, 0, 0, 0, 8, 8, 9, 9,10,10, 9, 9,11, + 10,11,11,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10,10, + 11,11,11,12,12,12, 0, 0, 0, 9, 9, 9, 9,10,10,10, + 10,11,11,12,12,13,13, 0, 0, 0,10,10,10,10,11,11, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0,10, 9,10, + 11,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10, 9,10,11,12,12,13,13,14,13, 0, 0, 0, 0, 0, 9, + 9, 9,10,10,10,11,11,13,12,13,13, 0, 0, 0, 0, 0, + 10,10,10,10,11,11,12,12,13,13,14,14, 0, 0, 0, 0, + 0, 0, 0,10,10,11,11,12,12,13,13,13,14, 0, 0, 0, + 0, 0, 0, 0,11,11,11,11,12,12,13,14,14,14, 0, 0, + 0, 0, 0, 0, 0,11,11,11,11,12,12,13,13,14,13, 0, + 0, 0, 0, 0, 0, 0,11,11,12,12,13,13,14,14,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,14, + 14, + }; + + static float _vq_quantthresh__8c0_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__8c0_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p6_0 = { + _vq_quantthresh__8c0_s_p6_0, + _vq_quantmap__8c0_s_p6_0, + 17, + 17 + }; + + static static_codebook _8c0_s_p6_0 = { + 2, 289, + _vq_lengthlist__8c0_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__8c0_s_p6_0, + NULL, + &_vq_auxt__8c0_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__8c0_s_p7_0[] = { + 1, 4, 4, 7, 6, 6, 7, 6, 6, 4, 7, 7,11, 9,10,12, + 9,10, 4, 7, 7,10,10,10,11, 9, 9, 6,11,10,11,11, + 12,11,11,11, 6,10,10,11,11,12,11,10,10, 6, 9,10, + 11,11,11,11,10,10, 7,10,11,12,11,11,12,11,12, 6, + 9, 9,10, 9, 9,11,10,10, 6, 9, 9,10,10,10,11,10, + 10, + }; + + static float _vq_quantthresh__8c0_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__8c0_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p7_0 = { + _vq_quantthresh__8c0_s_p7_0, + _vq_quantmap__8c0_s_p7_0, + 3, + 3 + }; + + static static_codebook _8c0_s_p7_0 = { + 4, 81, + _vq_lengthlist__8c0_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__8c0_s_p7_0, + NULL, + &_vq_auxt__8c0_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__8c0_s_p7_1[] = { + 1, 3, 3, 6, 6, 8, 8, 9, 9, 9, 9,10,10,10, 7, 7, + 8, 8, 9, 9, 9, 9,10,10, 9, 7, 7, 8, 8, 9, 9, 9, + 9,10,10,10, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10, 8, + 8, 9, 9, 9, 9, 8, 9,10,10,10, 8, 8, 9, 9, 9,10, + 10,10,10,10,10, 9, 9, 9, 9, 9, 9,10,10,11,10,11, + 9, 9, 9, 9,10,10,10,10,11,11,11,10,10, 9, 9,10, + 10,10, 9,11,10,10,10,10,10,10, 9, 9,10,10,11,11, + 10,10,10, 9, 9, 9,10,10,10, + }; + + static float _vq_quantthresh__8c0_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__8c0_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p7_1 = { + _vq_quantthresh__8c0_s_p7_1, + _vq_quantmap__8c0_s_p7_1, + 11, + 11 + }; + + static static_codebook _8c0_s_p7_1 = { + 2, 121, + _vq_lengthlist__8c0_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__8c0_s_p7_1, + NULL, + &_vq_auxt__8c0_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__8c0_s_p8_0[] = { + 1, 4, 4, 7, 6, 7, 7, 7, 7, 8, 8, 9, 9, 7, 6, 6, + 7, 7, 8, 8, 7, 7, 8, 9,10,10, 7, 6, 6, 7, 7, 8, + 7, 7, 7, 9, 9,10,12, 0, 8, 8, 8, 8, 8, 9, 8, 8, + 9, 9,10,10, 0, 8, 8, 8, 8, 8, 9, 8, 9, 9, 9,11, + 10, 0, 0,13, 9, 8, 9, 9, 9, 9,10,10,11,11, 0,13, + 0, 9, 9, 9, 9, 9, 9,11,10,11,11, 0, 0, 0, 8, 9, + 10, 9,10,10,13,11,12,12, 0, 0, 0, 8, 9, 9, 9,10, + 10,13,12,12,13, 0, 0, 0,12, 0,10,10,12,11,10,11, + 12,12, 0, 0, 0,13,13,10,10,10,11,12, 0,13, 0, 0, + 0, 0, 0, 0,13,11, 0,12,12,12,13,12, 0, 0, 0, 0, + 0, 0,13,13,11,13,13,11,12, + }; + + static float _vq_quantthresh__8c0_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__8c0_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p8_0 = { + _vq_quantthresh__8c0_s_p8_0, + _vq_quantmap__8c0_s_p8_0, + 13, + 13 + }; + + static static_codebook _8c0_s_p8_0 = { + 2, 169, + _vq_lengthlist__8c0_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__8c0_s_p8_0, + NULL, + &_vq_auxt__8c0_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__8c0_s_p8_1[] = { + 1, 3, 4, 5, 5, 7, 6, 6, 6, 5, 7, 7, 7, 6, 6, 7, + 7, 7, 6, 6, 7, 7, 7, 6, 6, + }; + + static float _vq_quantthresh__8c0_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__8c0_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p8_1 = { + _vq_quantthresh__8c0_s_p8_1, + _vq_quantmap__8c0_s_p8_1, + 5, + 5 + }; + + static static_codebook _8c0_s_p8_1 = { + 2, 25, + _vq_lengthlist__8c0_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__8c0_s_p8_1, + NULL, + &_vq_auxt__8c0_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p9_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__8c0_s_p9_0[] = { + 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, + }; + + static float _vq_quantthresh__8c0_s_p9_0[] = { + -157.5, 157.5, + }; + + static long _vq_quantmap__8c0_s_p9_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p9_0 = { + _vq_quantthresh__8c0_s_p9_0, + _vq_quantmap__8c0_s_p9_0, + 3, + 3 + }; + + static static_codebook _8c0_s_p9_0 = { + 4, 81, + _vq_lengthlist__8c0_s_p9_0, + 1, -518803456, 1628680192, 2, 0, + _vq_quantlist__8c0_s_p9_0, + NULL, + &_vq_auxt__8c0_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__8c0_s_p9_1[] = { + 1, 4, 4, 5, 5,10, 8,11,11,11,11,11,11,11,11, 6, + 6, 6, 7, 6,11,10,11,11,11,11,11,11,11,11, 7, 5, + 6, 6, 6, 8, 7,11,11,11,11,11,11,11,11,11, 7, 8, + 8, 8, 9, 9,11,11,11,11,11,11,11,11,11, 9, 8, 7, + 8, 9,11,11,11,11,11,11,11,11,11,11,11,10,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11, + 11, + }; + + static float _vq_quantthresh__8c0_s_p9_1[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__8c0_s_p9_1[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p9_1 = { + _vq_quantthresh__8c0_s_p9_1, + _vq_quantmap__8c0_s_p9_1, + 15, + 15 + }; + + static static_codebook _8c0_s_p9_1 = { + 2, 225, + _vq_lengthlist__8c0_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__8c0_s_p9_1, + NULL, + &_vq_auxt__8c0_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__8c0_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__8c0_s_p9_2[] = { + 1, 5, 5, 7, 7, 8, 7, 8, 8,10,10, 9, 9,10,10,10, + 11,11,10,12,11,12,12,12, 9, 8, 8, 8, 8, 8, 9,10, + 10,10,10,11,11,11,10,11,11,12,12,11,12, 8, 8, 7, + 7, 8, 9,10,10,10, 9,10,10, 9,10,10,11,11,11,11, + 11,11, 9, 9, 9, 9, 8, 9,10,10,11,10,10,11,11,12, + 10,10,12,12,11,11,10, 9, 9,10, 8, 9,10,10,10, 9, + 10,10,11,11,10,11,10,10,10,12,12,12, 9,10, 9,10, + 9, 9,10,10,11,11,11,11,10,10,10,11,12,11,12,11, + 12,10,11,10,11, 9,10, 9,10, 9,10,10, 9,10,10,11, + 10,11,11,11,11,12,11, 9,10,10,10,10,11,11,11,11, + 11,10,11,11,11,11,10,12,10,12,12,11,12,10,10,11, + 10, 9,11,10,11, 9,10,11,10,10,10,11,11,11,11,12, + 12,10, 9, 9,11,10, 9,12,11,10,12,12,11,11,11,11, + 10,11,11,12,11,10,12, 9,11,10,11,10,10,11,10,11, + 9,10,10,10,11,12,11,11,12,11,10,10,11,11, 9,10, + 10,12,10,11,10,10,10, 9,10,10,10,10, 9,10,10,11, + 11,11,11,12,11,10,10,10,10,11,11,10,11,11, 9,11, + 10,12,10,12,11,10,11,10,10,10,11,10,10,11,11,10, + 11,10,10,10,10,11,11,12,10,10,10,11,10,11,12,11, + 10,11,10,10,11,11,10,12,10, 9,10,10,11,11,11,10, + 12,10,10,11,11,11,10,10,11,10,10,10,11,10,11,10, + 12,11,11,10,10,10,12,10,10,11, 9,10,11,11,11,10, + 10,11,10,10, 9,11,11,12,12,11,12,11,11,11,11,11, + 11, 9,10,11,10,12,10,10,10,10,11,10,10,11,10,10, + 12,10,10,10,10,10, 9,12,10,10,10,10,12, 9,11,10, + 10,11,10,12,12,10,12,12,12,10,10,10,10, 9,10,11, + 10,10,12,10,10,12,11,10,11,10,10,12,11,10,12,10, + 10,11, 9,11,10, 9,10, 9,10, + }; + + static float _vq_quantthresh__8c0_s_p9_2[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__8c0_s_p9_2[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__8c0_s_p9_2 = { + _vq_quantthresh__8c0_s_p9_2, + _vq_quantmap__8c0_s_p9_2, + 21, + 21 + }; + + static static_codebook _8c0_s_p9_2 = { + 2, 441, + _vq_lengthlist__8c0_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__8c0_s_p9_2, + NULL, + &_vq_auxt__8c0_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__8c0_s_single[] = { + 4, 5,18, 7,10, 6, 7, 8, 9,10, 5, 2,18, 5, 7, 5, + 6, 7, 8,11,17,17,17,17,17,17,17,17,17,17, 7, 4, + 17, 6, 9, 6, 8,10,12,15,11, 7,17, 9, 6, 6, 7, 9, + 11,15, 6, 4,17, 6, 6, 4, 5, 8,11,16, 6, 6,17, 8, + 6, 5, 6, 9,13,16, 8, 9,17,11, 9, 8, 8,11,13,17, + 9,12,17,15,14,13,12,13,14,17,12,15,17,17,17,17, + 17,16,17,17, + }; + + static static_codebook _huff_book__8c0_s_single = { + 2, 100, + _huff_lengthlist__8c0_s_single, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p1_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__8c1_s_p1_0[] = { + 1, 5, 5, 0, 0, 0, 0, 0, 0, 5, 7, 7, 0, 0, 0, 0, + 0, 0, 5, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 5, 8, 7, 0, 0, 0, 0, 0, 0, 7, 8, 9, 0, 0, 0, + 0, 0, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 7, 8, 0, 0, 0, 0, 0, 0, 7, 9, 8, 0, 0, + 0, 0, 0, 0, 7, 9, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 8, 8, 0, 0, 0, 0, + 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, + 0, 0, 0, 8, 8,10, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 9, 9, 0, 0, + 0, 0, 0, 0, 8,10, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 5, 8, 8, 0, 0, 0, 0, 0, 0, 8, 9, 9, 0, 0, + 0, 0, 0, 0, 8, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, 0, + 0, 0, 0, 0, 0, 8, 9,10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 7, 9, 9, 0, 0, 0, 0, 0, 0, 9,10,10, + 0, 0, 0, 0, 0, 0, 8,10, 8, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c1_s_p1_0[] = { + -0.5, 0.5, + }; + + static long _vq_quantmap__8c1_s_p1_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p1_0 = { + _vq_quantthresh__8c1_s_p1_0, + _vq_quantmap__8c1_s_p1_0, + 3, + 3 + }; + + static static_codebook _8c1_s_p1_0 = { + 8, 6561, + _vq_lengthlist__8c1_s_p1_0, + 1, -535822336, 1611661312, 2, 0, + _vq_quantlist__8c1_s_p1_0, + NULL, + &_vq_auxt__8c1_s_p1_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p2_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__8c1_s_p2_0[] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c1_s_p2_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__8c1_s_p2_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p2_0 = { + _vq_quantthresh__8c1_s_p2_0, + _vq_quantmap__8c1_s_p2_0, + 5, + 5 + }; + + static static_codebook _8c1_s_p2_0 = { + 4, 625, + _vq_lengthlist__8c1_s_p2_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__8c1_s_p2_0, + NULL, + &_vq_auxt__8c1_s_p2_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p3_0[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__8c1_s_p3_0[] = { + 2, 4, 4, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 4, 4, 4, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 6, 6, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 6, 6, 6, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c1_s_p3_0[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__8c1_s_p3_0[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p3_0 = { + _vq_quantthresh__8c1_s_p3_0, + _vq_quantmap__8c1_s_p3_0, + 5, + 5 + }; + + static static_codebook _8c1_s_p3_0 = { + 4, 625, + _vq_lengthlist__8c1_s_p3_0, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__8c1_s_p3_0, + NULL, + &_vq_auxt__8c1_s_p3_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p4_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__8c1_s_p4_0[] = { + 1, 2, 3, 7, 7, 0, 0, 0, 0, 0, 0, 0, 6, 6, 0, 0, + 0, 0, 0, 0, 0, 6, 6, 0, 0, 0, 0, 0, 0, 0, 7, 7, + 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, + 8, 8, 0, 0, 0, 0, 0, 0, 0, 9, 8, 0, 0, 0, 0, 0, + 0, 0,10,10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, + }; + + static float _vq_quantthresh__8c1_s_p4_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__8c1_s_p4_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p4_0 = { + _vq_quantthresh__8c1_s_p4_0, + _vq_quantmap__8c1_s_p4_0, + 9, + 9 + }; + + static static_codebook _8c1_s_p4_0 = { + 2, 81, + _vq_lengthlist__8c1_s_p4_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__8c1_s_p4_0, + NULL, + &_vq_auxt__8c1_s_p4_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p5_0[] = { + 4, + 3, + 5, + 2, + 6, + 1, + 7, + 0, + 8, + }; + + static long _vq_lengthlist__8c1_s_p5_0[] = { + 1, 3, 3, 4, 5, 6, 6, 8, 8, 0, 0, 0, 8, 8, 7, 7, + 9, 9, 0, 0, 0, 8, 8, 7, 7, 9, 9, 0, 0, 0, 9,10, + 8, 8, 9, 9, 0, 0, 0,10,10, 8, 8, 9, 9, 0, 0, 0, + 11,10, 8, 8,10,10, 0, 0, 0,11,11, 8, 8,10,10, 0, + 0, 0,12,12, 9, 9,10,10, 0, 0, 0, 0, 0, 9, 9,10, + 10, + }; + + static float _vq_quantthresh__8c1_s_p5_0[] = { + -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, + }; + + static long _vq_quantmap__8c1_s_p5_0[] = { + 7, 5, 3, 1, 0, 2, 4, 6, + 8, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p5_0 = { + _vq_quantthresh__8c1_s_p5_0, + _vq_quantmap__8c1_s_p5_0, + 9, + 9 + }; + + static static_codebook _8c1_s_p5_0 = { + 2, 81, + _vq_lengthlist__8c1_s_p5_0, + 1, -531628032, 1611661312, 4, 0, + _vq_quantlist__8c1_s_p5_0, + NULL, + &_vq_auxt__8c1_s_p5_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p6_0[] = { + 8, + 7, + 9, + 6, + 10, + 5, + 11, + 4, + 12, + 3, + 13, + 2, + 14, + 1, + 15, + 0, + 16, + }; + + static long _vq_lengthlist__8c1_s_p6_0[] = { + 1, 3, 3, 5, 5, 8, 8, 8, 8, 9, 9,10,10,11,11,11, + 11, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11,11, + 12,12, 0, 0, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11,11, + 12,12,12,12, 0, 0, 0, 9, 9, 8, 8,10,10,10,10,11, + 11,12,12,12,12, 0, 0, 0,10,10, 9, 9,10,10,10,10, + 11,11,12,12,13,13, 0, 0, 0,10,10, 9, 9,10,10,10, + 10,11,11,12,12,13,13, 0, 0, 0,11,11, 9, 9,10,10, + 10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9,10, + 10,10,10,11,11,12,12,13,13, 0, 0, 0, 0, 0, 9, 9, + 10,10,11,11,12,12,12,12,13,13, 0, 0, 0, 0, 0, 9, + 9,10,10,11,11,12,11,12,12,13,13, 0, 0, 0, 0, 0, + 10,10,11,11,11,11,12,12,13,12,13,13, 0, 0, 0, 0, + 0, 0, 0,11,10,11,11,12,12,13,13,13,13, 0, 0, 0, + 0, 0, 0, 0,11,11,12,12,12,12,13,13,13,14, 0, 0, + 0, 0, 0, 0, 0,11,11,12,12,12,12,13,13,14,13, 0, + 0, 0, 0, 0, 0, 0,12,12,12,12,13,13,13,13,14,14, + 0, 0, 0, 0, 0, 0, 0, 0, 0,12,12,13,13,13,13,14, + 14, + }; + + static float _vq_quantthresh__8c1_s_p6_0[] = { + -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, -1.5, -0.5, + 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, + }; + + static long _vq_quantmap__8c1_s_p6_0[] = { + 15, 13, 11, 9, 7, 5, 3, 1, + 0, 2, 4, 6, 8, 10, 12, 14, + 16, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p6_0 = { + _vq_quantthresh__8c1_s_p6_0, + _vq_quantmap__8c1_s_p6_0, + 17, + 17 + }; + + static static_codebook _8c1_s_p6_0 = { + 2, 289, + _vq_lengthlist__8c1_s_p6_0, + 1, -529530880, 1611661312, 5, 0, + _vq_quantlist__8c1_s_p6_0, + NULL, + &_vq_auxt__8c1_s_p6_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p7_0[] = { + 1, + 0, + 2, + }; + + static long _vq_lengthlist__8c1_s_p7_0[] = { + 1, 4, 4, 6, 6, 6, 7, 6, 6, 4, 7, 7,10, 9, 9,10, + 9, 9, 5, 7, 7,10, 9, 9,10, 9, 9, 6,10,10,10,10, + 10,11,10,10, 6, 9, 9,10, 9,10,11,10,10, 6, 9, 9, + 10, 9, 9,11, 9,10, 7,10,10,11,11,11,11,10,10, 6, + 9, 9,10,10,10,11, 9, 9, 6, 9, 9,10,10,10,10, 9, + 9, + }; + + static float _vq_quantthresh__8c1_s_p7_0[] = { + -5.5, 5.5, + }; + + static long _vq_quantmap__8c1_s_p7_0[] = { + 1, 0, 2, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p7_0 = { + _vq_quantthresh__8c1_s_p7_0, + _vq_quantmap__8c1_s_p7_0, + 3, + 3 + }; + + static static_codebook _8c1_s_p7_0 = { + 4, 81, + _vq_lengthlist__8c1_s_p7_0, + 1, -529137664, 1618345984, 2, 0, + _vq_quantlist__8c1_s_p7_0, + NULL, + &_vq_auxt__8c1_s_p7_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p7_1[] = { + 5, + 4, + 6, + 3, + 7, + 2, + 8, + 1, + 9, + 0, + 10, + }; + + static long _vq_lengthlist__8c1_s_p7_1[] = { + 2, 3, 3, 5, 5, 7, 7, 7, 7, 7, 7,10,10, 9, 7, 7, + 7, 7, 8, 8, 8, 8, 9, 9, 9, 7, 7, 7, 7, 8, 8, 8, + 8,10,10,10, 7, 7, 7, 7, 8, 8, 8, 8,10,10,10, 7, + 7, 7, 7, 8, 8, 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, + 8, 8,10,10,10, 8, 8, 8, 8, 8, 8, 8, 8,10,10,10, + 8, 8, 8, 8, 8, 8, 8, 8,10,10,10,10,10, 8, 8, 8, + 8, 8, 8,10,10,10,10,10, 8, 8, 8, 8, 8, 8,10,10, + 10,10,10, 8, 8, 8, 8, 8, 8, + }; + + static float _vq_quantthresh__8c1_s_p7_1[] = { + -4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, + 3.5, 4.5, + }; + + static long _vq_quantmap__8c1_s_p7_1[] = { + 9, 7, 5, 3, 1, 0, 2, 4, + 6, 8, 10, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p7_1 = { + _vq_quantthresh__8c1_s_p7_1, + _vq_quantmap__8c1_s_p7_1, + 11, + 11 + }; + + static static_codebook _8c1_s_p7_1 = { + 2, 121, + _vq_lengthlist__8c1_s_p7_1, + 1, -531365888, 1611661312, 4, 0, + _vq_quantlist__8c1_s_p7_1, + NULL, + &_vq_auxt__8c1_s_p7_1, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p8_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__8c1_s_p8_0[] = { + 1, 4, 4, 6, 6, 8, 8, 8, 8, 9, 9,10,10, 7, 5, 5, + 7, 7, 8, 8, 8, 8, 9,10,11,11, 7, 5, 5, 7, 7, 8, + 8, 9, 9,10,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9, + 9,10,11,11, 0, 8, 8, 8, 8, 9, 9, 9, 9,10,10,11, + 11, 0,12,12, 9, 9, 9, 9,10, 9,10,11,11,11, 0,13, + 12, 9, 8, 9, 9,10,10,11,11,12,11, 0, 0, 0, 9, 9, + 9, 9,10,10,11,11,12,12, 0, 0, 0,10,10, 9, 9,10, + 10,11,11,12,12, 0, 0, 0,13,13,10,10,11,11,12,11, + 13,12, 0, 0, 0,14,14,10,10,11,10,11,11,12,12, 0, + 0, 0, 0, 0,12,12,11,11,12,12,13,13, 0, 0, 0, 0, + 0,12,12,11,10,12,11,13,12, + }; + + static float _vq_quantthresh__8c1_s_p8_0[] = { + -27.5, -22.5, -17.5, -12.5, -7.5, -2.5, 2.5, 7.5, + 12.5, 17.5, 22.5, 27.5, + }; + + static long _vq_quantmap__8c1_s_p8_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p8_0 = { + _vq_quantthresh__8c1_s_p8_0, + _vq_quantmap__8c1_s_p8_0, + 13, + 13 + }; + + static static_codebook _8c1_s_p8_0 = { + 2, 169, + _vq_lengthlist__8c1_s_p8_0, + 1, -526516224, 1616117760, 4, 0, + _vq_quantlist__8c1_s_p8_0, + NULL, + &_vq_auxt__8c1_s_p8_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p8_1[] = { + 2, + 1, + 3, + 0, + 4, + }; + + static long _vq_lengthlist__8c1_s_p8_1[] = { + 2, 3, 3, 5, 5, 6, 6, 6, 5, 5, 6, 6, 6, 5, 5, 6, + 6, 6, 5, 5, 6, 6, 6, 5, 5, + }; + + static float _vq_quantthresh__8c1_s_p8_1[] = { + -1.5, -0.5, 0.5, 1.5, + }; + + static long _vq_quantmap__8c1_s_p8_1[] = { + 3, 1, 0, 2, 4, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p8_1 = { + _vq_quantthresh__8c1_s_p8_1, + _vq_quantmap__8c1_s_p8_1, + 5, + 5 + }; + + static static_codebook _8c1_s_p8_1 = { + 2, 25, + _vq_lengthlist__8c1_s_p8_1, + 1, -533725184, 1611661312, 3, 0, + _vq_quantlist__8c1_s_p8_1, + NULL, + &_vq_auxt__8c1_s_p8_1, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p9_0[] = { + 6, + 5, + 7, + 4, + 8, + 3, + 9, + 2, + 10, + 1, + 11, + 0, + 12, + }; + + static long _vq_lengthlist__8c1_s_p9_0[] = { + 1, 3, 3,10,10,10,10,10,10,10,10,10,10, 5, 6, 6, + 10,10,10,10,10,10,10,10,10,10, 6, 7, 8,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 10,10,10,10,10, 9, 9, 9, 9, + }; + + static float _vq_quantthresh__8c1_s_p9_0[] = { + -1732.5, -1417.5, -1102.5, -787.5, -472.5, -157.5, 157.5, 472.5, + 787.5, 1102.5, 1417.5, 1732.5, + }; + + static long _vq_quantmap__8c1_s_p9_0[] = { + 11, 9, 7, 5, 3, 1, 0, 2, + 4, 6, 8, 10, 12, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p9_0 = { + _vq_quantthresh__8c1_s_p9_0, + _vq_quantmap__8c1_s_p9_0, + 13, + 13 + }; + + static static_codebook _8c1_s_p9_0 = { + 2, 169, + _vq_lengthlist__8c1_s_p9_0, + 1, -513964032, 1628680192, 4, 0, + _vq_quantlist__8c1_s_p9_0, + NULL, + &_vq_auxt__8c1_s_p9_0, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p9_1[] = { + 7, + 6, + 8, + 5, + 9, + 4, + 10, + 3, + 11, + 2, + 12, + 1, + 13, + 0, + 14, + }; + + static long _vq_lengthlist__8c1_s_p9_1[] = { + 1, 4, 4, 5, 5, 7, 7, 9, 9,11,11,12,12,13,13, 6, + 5, 5, 6, 6, 9, 9,10,10,12,12,12,13,15,14, 6, 5, + 5, 7, 7, 9, 9,10,10,12,12,12,13,14,13,17, 7, 7, + 8, 8,10,10,11,11,12,13,13,13,13,13,17, 7, 7, 8, + 8,10,10,11,11,13,13,13,13,14,14,17,11,11, 9, 9, + 11,11,12,12,12,13,13,14,15,13,17,12,12, 9, 9,11, + 11,12,12,13,13,13,13,14,16,17,17,17,11,12,12,12, + 13,13,13,14,15,14,15,15,17,17,17,12,12,11,11,13, + 13,14,14,15,14,15,15,17,17,17,15,15,13,13,14,14, + 15,14,15,15,16,15,17,17,17,15,15,13,13,13,14,14, + 15,15,15,15,16,17,17,17,17,16,14,15,14,14,15,14, + 14,15,15,15,17,17,17,17,17,14,14,16,14,15,15,15, + 15,15,15,17,17,17,17,17,17,16,16,15,17,15,15,14, + 17,15,17,16,17,17,17,17,16,15,14,15,15,15,15,15, + 15, + }; + + static float _vq_quantthresh__8c1_s_p9_1[] = { + -136.5, -115.5, -94.5, -73.5, -52.5, -31.5, -10.5, 10.5, + 31.5, 52.5, 73.5, 94.5, 115.5, 136.5, + }; + + static long _vq_quantmap__8c1_s_p9_1[] = { + 13, 11, 9, 7, 5, 3, 1, 0, + 2, 4, 6, 8, 10, 12, 14, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p9_1 = { + _vq_quantthresh__8c1_s_p9_1, + _vq_quantmap__8c1_s_p9_1, + 15, + 15 + }; + + static static_codebook _8c1_s_p9_1 = { + 2, 225, + _vq_lengthlist__8c1_s_p9_1, + 1, -520986624, 1620377600, 4, 0, + _vq_quantlist__8c1_s_p9_1, + NULL, + &_vq_auxt__8c1_s_p9_1, + NULL, + 0 + }; + + static long _vq_quantlist__8c1_s_p9_2[] = { + 10, + 9, + 11, + 8, + 12, + 7, + 13, + 6, + 14, + 5, + 15, + 4, + 16, + 3, + 17, + 2, + 18, + 1, + 19, + 0, + 20, + }; + + static long _vq_lengthlist__8c1_s_p9_2[] = { + 2, 4, 4, 6, 6, 7, 7, 8, 8, 8, 8, 9, 8, 9, 9, 9, + 9, 9, 9, 9, 9,11,11,12, 7, 7, 7, 7, 8, 8, 9, 9, + 9, 9,10,10,10,10,10,10,10,10,11,11,11, 7, 7, 7, + 7, 8, 8, 9, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,11, + 11,12, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9,10,10,10,10, + 10,10,10,10,11,11,11, 7, 7, 8, 8, 8, 8, 9, 9, 9, + 9,10,10,10,10,10,10,10,10,11,11,11, 8, 8, 8, 8, + 9, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,11,11, + 11, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,11,12,11, 9, 9, 8, 9, 9, 9, 9, 9,10,10, + 10,10,10,10,10,10,10,10,11,11,11,11,11, 8, 8, 9, + 9, 9, 9,10,10,10,10,10,10,10,10,10,10,11,12,11, + 12,11, 9, 9, 9, 9, 9,10,10,10,10,10,10,10,10,10, + 10,10,11,11,11,11,11, 9, 9, 9, 9,10,10,10,10,10, + 10,10,10,10,10,10,10,12,11,12,11,11, 9, 9, 9,10, + 10,10,10,10,10,10,10,10,10,10,10,10,12,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,11,12,11,11,12,11,10,10,10,10,10,10,10,10, + 10,10,10,10,11,10,11,11,11,11,11,11,11,10,10,10, + 10,10,10,10,10,10,10,10,10,10,10,11,11,12,11,12, + 11,11,10,10,10,10,10,10,10,10,10,10,10,10,10,10, + 11,11,12,11,12,11,11,11,11,10,10,10,10,10,10,10, + 10,10,10,10,10,11,11,12,11,11,12,11,11,12,10,10, + 11,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11, + 11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,12, + 12,11,12,11,11,12,12,12,11,11,10,10,10,10,10,10, + 10,10,10,11,12,12,11,12,12,11,12,11,11,11,11,10, + 10,10,10,10,10,10,10,10,10, + }; + + static float _vq_quantthresh__8c1_s_p9_2[] = { + -9.5, -8.5, -7.5, -6.5, -5.5, -4.5, -3.5, -2.5, + -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, + 6.5, 7.5, 8.5, 9.5, + }; + + static long _vq_quantmap__8c1_s_p9_2[] = { + 19, 17, 15, 13, 11, 9, 7, 5, + 3, 1, 0, 2, 4, 6, 8, 10, + 12, 14, 16, 18, 20, + }; + + static encode_aux_threshmatch _vq_auxt__8c1_s_p9_2 = { + _vq_quantthresh__8c1_s_p9_2, + _vq_quantmap__8c1_s_p9_2, + 21, + 21 + }; + + static static_codebook _8c1_s_p9_2 = { + 2, 441, + _vq_lengthlist__8c1_s_p9_2, + 1, -529268736, 1611661312, 5, 0, + _vq_quantlist__8c1_s_p9_2, + NULL, + &_vq_auxt__8c1_s_p9_2, + NULL, + 0 + }; + + static long _huff_lengthlist__8c1_s_single[] = { + 4, 6,18, 8,11, 8, 8, 9, 9,10, 4, 4,18, 5, 9, 5, + 6, 7, 8,10,18,18,18,18,17,17,17,17,17,17, 7, 5, + 17, 6,11, 6, 7, 8, 9,12,12, 9,17,12, 8, 8, 9,10, + 10,13, 7, 5,17, 6, 8, 4, 5, 6, 8,10, 6, 5,17, 6, + 8, 5, 4, 5, 7, 9, 7, 7,17, 8, 9, 6, 5, 5, 6, 8, + 8, 8,17, 9,11, 8, 6, 6, 6, 7, 9,10,17,12,12,10, + 9, 7, 7, 8, + }; + + static static_codebook _huff_book__8c1_s_single = { + 2, 100, + _huff_lengthlist__8c1_s_single, + 0, 0, 0, 0, 0, + NULL, + NULL, + NULL, + NULL, + 0 + }; + + /***** residue backends *********************************************/ + + static vorbis_info_residue0 _residue_44_mid={ + 0,-1, -1, 10,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { .5, 1.5, 1.5, 2.5, 2.5, 4.5, 8.5, 16.5, 32.5}, + { .5, .5, 999., .5, 999., 4.5, 8.5, 16.5, 32.5}, + }; + + static vorbis_info_residue0 _residue_44_high={ + 0,-1, -1, 10,-1, + /* 0 1 2 3 4 5 6 7 8 */ + {0}, + {-1}, + { .5, 1.5, 2.5, 4.5, 8.5, 16.5, 32.5, 71.5,157.5}, + { .5, 1.5, 2.5, 3.5, 4.5, 8.5, 16.5, 71.5,157.5}, + }; + + static static_bookblock _resbook_44s_0={ + { + {0},{0,0,&_44c0_s_p1_0},{0,0,&_44c0_s_p2_0},{0,0,&_44c0_s_p3_0}, + {0,0,&_44c0_s_p4_0},{0,0,&_44c0_s_p5_0},{0,0,&_44c0_s_p6_0}, + {&_44c0_s_p7_0,&_44c0_s_p7_1},{&_44c0_s_p8_0,&_44c0_s_p8_1}, + {&_44c0_s_p9_0,&_44c0_s_p9_1,&_44c0_s_p9_2} + } + }; + static static_bookblock _resbook_44sm_0={ + { + {0},{0,0,&_44c0_sm_p1_0},{0,0,&_44c0_sm_p2_0},{0,0,&_44c0_sm_p3_0}, + {0,0,&_44c0_sm_p4_0},{0,0,&_44c0_sm_p5_0},{0,0,&_44c0_sm_p6_0}, + {&_44c0_sm_p7_0,&_44c0_sm_p7_1},{&_44c0_sm_p8_0,&_44c0_sm_p8_1}, + {&_44c0_sm_p9_0,&_44c0_sm_p9_1,&_44c0_sm_p9_2} + } + }; + static static_bookblock _resbook_44s_1={ + { + {0},{0,0,&_44c1_s_p1_0},{0,0,&_44c1_s_p2_0},{0,0,&_44c1_s_p3_0}, + {0,0,&_44c1_s_p4_0},{0,0,&_44c1_s_p5_0},{0,0,&_44c1_s_p6_0}, + {&_44c1_s_p7_0,&_44c1_s_p7_1},{&_44c1_s_p8_0,&_44c1_s_p8_1}, + {&_44c1_s_p9_0,&_44c1_s_p9_1,&_44c1_s_p9_2} + } + }; + static static_bookblock _resbook_44sm_1={ + { + {0},{0,0,&_44c1_sm_p1_0},{0,0,&_44c1_sm_p2_0},{0,0,&_44c1_sm_p3_0}, + {0,0,&_44c1_sm_p4_0},{0,0,&_44c1_sm_p5_0},{0,0,&_44c1_sm_p6_0}, + {&_44c1_sm_p7_0,&_44c1_sm_p7_1},{&_44c1_sm_p8_0,&_44c1_sm_p8_1}, + {&_44c1_sm_p9_0,&_44c1_sm_p9_1,&_44c1_sm_p9_2} + } + }; + static static_bookblock _resbook_44s_2={ + { + {0},{0,0,&_44c2_s_p1_0},{0,0,&_44c2_s_p2_0},{0,0,&_44c2_s_p3_0}, + {0,0,&_44c2_s_p4_0},{0,0,&_44c2_s_p5_0},{0,0,&_44c2_s_p6_0}, + {&_44c2_s_p7_0,&_44c2_s_p7_1},{&_44c2_s_p8_0,&_44c2_s_p8_1}, + {&_44c2_s_p9_0,&_44c2_s_p9_1,&_44c2_s_p9_2} + } + }; + static static_bookblock _resbook_44s_3={ + { + {0},{0,0,&_44c3_s_p1_0},{0,0,&_44c3_s_p2_0},{0,0,&_44c3_s_p3_0}, + {0,0,&_44c3_s_p4_0},{0,0,&_44c3_s_p5_0},{0,0,&_44c3_s_p6_0}, + {&_44c3_s_p7_0,&_44c3_s_p7_1},{&_44c3_s_p8_0,&_44c3_s_p8_1}, + {&_44c3_s_p9_0,&_44c3_s_p9_1,&_44c3_s_p9_2} + } + }; + static static_bookblock _resbook_44s_4={ + { + {0},{0,0,&_44c4_s_p1_0},{0,0,&_44c4_s_p2_0},{0,0,&_44c4_s_p3_0}, + {0,0,&_44c4_s_p4_0},{0,0,&_44c4_s_p5_0},{0,0,&_44c4_s_p6_0}, + {&_44c4_s_p7_0,&_44c4_s_p7_1},{&_44c4_s_p8_0,&_44c4_s_p8_1}, + {&_44c4_s_p9_0,&_44c4_s_p9_1,&_44c4_s_p9_2} + } + }; + static static_bookblock _resbook_44s_5={ + { + {0},{0,0,&_44c5_s_p1_0},{0,0,&_44c5_s_p2_0},{0,0,&_44c5_s_p3_0}, + {0,0,&_44c5_s_p4_0},{0,0,&_44c5_s_p5_0},{0,0,&_44c5_s_p6_0}, + {&_44c5_s_p7_0,&_44c5_s_p7_1},{&_44c5_s_p8_0,&_44c5_s_p8_1}, + {&_44c5_s_p9_0,&_44c5_s_p9_1,&_44c5_s_p9_2} + } + }; + static static_bookblock _resbook_44s_6={ + { + {0},{0,0,&_44c6_s_p1_0},{0,0,&_44c6_s_p2_0},{0,0,&_44c6_s_p3_0}, + {0,0,&_44c6_s_p4_0}, + {&_44c6_s_p5_0,&_44c6_s_p5_1}, + {&_44c6_s_p6_0,&_44c6_s_p6_1}, + {&_44c6_s_p7_0,&_44c6_s_p7_1}, + {&_44c6_s_p8_0,&_44c6_s_p8_1}, + {&_44c6_s_p9_0,&_44c6_s_p9_1,&_44c6_s_p9_2} + } + }; + static static_bookblock _resbook_44s_7={ + { + {0},{0,0,&_44c7_s_p1_0},{0,0,&_44c7_s_p2_0},{0,0,&_44c7_s_p3_0}, + {0,0,&_44c7_s_p4_0}, + {&_44c7_s_p5_0,&_44c7_s_p5_1}, + {&_44c7_s_p6_0,&_44c7_s_p6_1}, + {&_44c7_s_p7_0,&_44c7_s_p7_1}, + {&_44c7_s_p8_0,&_44c7_s_p8_1}, + {&_44c7_s_p9_0,&_44c7_s_p9_1,&_44c7_s_p9_2} + } + }; + static static_bookblock _resbook_44s_8={ + { + {0},{0,0,&_44c8_s_p1_0},{0,0,&_44c8_s_p2_0},{0,0,&_44c8_s_p3_0}, + {0,0,&_44c8_s_p4_0}, + {&_44c8_s_p5_0,&_44c8_s_p5_1}, + {&_44c8_s_p6_0,&_44c8_s_p6_1}, + {&_44c8_s_p7_0,&_44c8_s_p7_1}, + {&_44c8_s_p8_0,&_44c8_s_p8_1}, + {&_44c8_s_p9_0,&_44c8_s_p9_1,&_44c8_s_p9_2} + } + }; + static static_bookblock _resbook_44s_9={ + { + {0},{0,0,&_44c9_s_p1_0},{0,0,&_44c9_s_p2_0},{0,0,&_44c9_s_p3_0}, + {0,0,&_44c9_s_p4_0}, + {&_44c9_s_p5_0,&_44c9_s_p5_1}, + {&_44c9_s_p6_0,&_44c9_s_p6_1}, + {&_44c9_s_p7_0,&_44c9_s_p7_1}, + {&_44c9_s_p8_0,&_44c9_s_p8_1}, + {&_44c9_s_p9_0,&_44c9_s_p9_1,&_44c9_s_p9_2} + } + }; + + + static vorbis_residue_template _res_44s_0[]={ + {2,0, &_residue_44_mid, + &_huff_book__44c0_s_short,&_huff_book__44c0_sm_short, + &_resbook_44s_0,&_resbook_44sm_0}, + + {2,0, &_residue_44_mid, + &_huff_book__44c0_s_long,&_huff_book__44c0_sm_long, + &_resbook_44s_0,&_resbook_44sm_0} + }; + static vorbis_residue_template _res_44s_1[]={ + {2,0, &_residue_44_mid, + &_huff_book__44c1_s_short,&_huff_book__44c1_sm_short, + &_resbook_44s_1,&_resbook_44sm_1}, + + {2,0, &_residue_44_mid, + &_huff_book__44c1_s_long,&_huff_book__44c1_sm_long, + &_resbook_44s_1,&_resbook_44sm_1} + }; + static vorbis_residue_template _res_44s_2[]={ + {2,0, &_residue_44_mid, + &_huff_book__44c2_s_short,&_huff_book__44c2_s_short, + &_resbook_44s_2,&_resbook_44s_2}, + + {2,0, &_residue_44_mid, + &_huff_book__44c2_s_long,&_huff_book__44c2_s_long, + &_resbook_44s_2,&_resbook_44s_2} + }; + static vorbis_residue_template _res_44s_3[]={ + {2,0, &_residue_44_mid, + &_huff_book__44c3_s_short,&_huff_book__44c3_s_short, + &_resbook_44s_3,&_resbook_44s_3}, + + {2,0, &_residue_44_mid, + &_huff_book__44c3_s_long,&_huff_book__44c3_s_long, + &_resbook_44s_3,&_resbook_44s_3} + }; + static vorbis_residue_template _res_44s_4[]={ + {2,0, &_residue_44_mid, + &_huff_book__44c4_s_short,&_huff_book__44c4_s_short, + &_resbook_44s_4,&_resbook_44s_4}, + + {2,0, &_residue_44_mid, + &_huff_book__44c4_s_long,&_huff_book__44c4_s_long, + &_resbook_44s_4,&_resbook_44s_4} + }; + static vorbis_residue_template _res_44s_5[]={ + {2,0, &_residue_44_mid, + &_huff_book__44c5_s_short,&_huff_book__44c5_s_short, + &_resbook_44s_5,&_resbook_44s_5}, + + {2,0, &_residue_44_mid, + &_huff_book__44c5_s_long,&_huff_book__44c5_s_long, + &_resbook_44s_5,&_resbook_44s_5} + }; + static vorbis_residue_template _res_44s_6[]={ + {2,0, &_residue_44_high, + &_huff_book__44c6_s_short,&_huff_book__44c6_s_short, + &_resbook_44s_6,&_resbook_44s_6}, + + {2,0, &_residue_44_high, + &_huff_book__44c6_s_long,&_huff_book__44c6_s_long, + &_resbook_44s_6,&_resbook_44s_6} + }; + static vorbis_residue_template _res_44s_7[]={ + {2,0, &_residue_44_high, + &_huff_book__44c7_s_short,&_huff_book__44c7_s_short, + &_resbook_44s_7,&_resbook_44s_7}, + + {2,0, &_residue_44_high, + &_huff_book__44c7_s_long,&_huff_book__44c7_s_long, + &_resbook_44s_7,&_resbook_44s_7} + }; + static vorbis_residue_template _res_44s_8[]={ + {2,0, &_residue_44_high, + &_huff_book__44c8_s_short,&_huff_book__44c8_s_short, + &_resbook_44s_8,&_resbook_44s_8}, + + {2,0, &_residue_44_high, + &_huff_book__44c8_s_long,&_huff_book__44c8_s_long, + &_resbook_44s_8,&_resbook_44s_8} + }; + static vorbis_residue_template _res_44s_9[]={ + {2,0, &_residue_44_high, + &_huff_book__44c9_s_short,&_huff_book__44c9_s_short, + &_resbook_44s_9,&_resbook_44s_9}, + + {2,0, &_residue_44_high, + &_huff_book__44c9_s_long,&_huff_book__44c9_s_long, + &_resbook_44s_9,&_resbook_44s_9} + }; + + static vorbis_mapping_template _mapres_template_44_stereo[]={ + { _map_nominal, _res_44s_0 }, /* 0 */ + { _map_nominal, _res_44s_1 }, /* 1 */ + { _map_nominal, _res_44s_2 }, /* 2 */ + { _map_nominal, _res_44s_3 }, /* 3 */ + { _map_nominal, _res_44s_4 }, /* 4 */ + { _map_nominal, _res_44s_5 }, /* 5 */ + { _map_nominal, _res_44s_6 }, /* 6 */ + { _map_nominal, _res_44s_7 }, /* 7 */ + { _map_nominal, _res_44s_8 }, /* 8 */ + { _map_nominal, _res_44s_9 }, /* 9 */ + }; + + /******************************************************************** + * * + * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE. * + * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS * + * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * + * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. * + * * + * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002 * + * by the XIPHOPHORUS Company http://www.xiph.org/ * + * * + ******************************************************************** + + function: key psychoacoustic settings for 44.1/48kHz + last mod: $Id: oggenc.c,v 1.1 2006/01/21 14:50:01 duraid Exp $ + + ********************************************************************/ + + + /* preecho trigger settings *****************************************/ + + static vorbis_info_psy_global _psy_global_44[5]={ + + {8, /* lines per eighth octave */ + {20.f,14.f,12.f,12.f,12.f,12.f,12.f}, + {-60.f,-30.f,-40.f,-40.f,-40.f,-40.f,-40.f}, 2,-75.f, + -6.f, + {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} + }, + {8, /* lines per eighth octave */ + {14.f,10.f,10.f,10.f,10.f,10.f,10.f}, + {-40.f,-30.f,-25.f,-25.f,-25.f,-25.f,-25.f}, 2,-80.f, + -6.f, + {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} + }, + {8, /* lines per eighth octave */ + {12.f,10.f,10.f,10.f,10.f,10.f,10.f}, + {-20.f,-20.f,-15.f,-15.f,-15.f,-15.f,-15.f}, 0,-80.f, + -6.f, + {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} + }, + {8, /* lines per eighth octave */ + {10.f,8.f,8.f,8.f,8.f,8.f,8.f}, + {-20.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-80.f, + -6.f, + {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} + }, + {8, /* lines per eighth octave */ + {10.f,6.f,6.f,6.f,6.f,6.f,6.f}, + {-15.f,-15.f,-12.f,-12.f,-12.f,-12.f,-12.f}, 0,-85.f, + -6.f, + {99.},{{99.},{99.}},{0},{0},{{0.},{0.}} + }, + }; + + /* noise compander lookups * low, mid, high quality ****************/ + static compandblock _psy_compand_44[6]={ + /* sub-mode Z short */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 9,10,11,12,13,14, 15, /* 15dB */ + 16,17,18,19,20,21,22, 23, /* 23dB */ + 24,25,26,27,28,29,30, 31, /* 31dB */ + 32,33,34,35,36,37,38, 39, /* 39dB */ + }}, + /* mode_Z nominal short*/ + {{ + 0, 1, 2, 3, 4, 5, 6, 6, /* 7dB */ + 7, 7, 7, 7, 6, 6, 6, 7, /* 15dB */ + 7, 8, 9,10,11,12,13, 14, /* 23dB */ + 15,16,17,17,17,18,18, 19, /* 31dB */ + 19,19,20,21,22,23,24, 25, /* 39dB */ + }}, + /* mode A short */ + {{ + 0, 1, 2, 3, 4, 5, 5, 5, /* 7dB */ + 6, 6, 6, 5, 4, 4, 4, 4, /* 15dB */ + 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ + 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ + 11,12,13,14,15,16,17, 18, /* 39dB */ + }}, + /* sub-mode Z long */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 9,10,11,12,13,14, 15, /* 15dB */ + 16,17,18,19,20,21,22, 23, /* 23dB */ + 24,25,26,27,28,29,30, 31, /* 31dB */ + 32,33,34,35,36,37,38, 39, /* 39dB */ + }}, + /* mode_Z nominal long */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 9,10,11,12,12,13, 13, /* 15dB */ + 13,14,14,14,15,15,15, 15, /* 23dB */ + 16,16,17,17,17,18,18, 19, /* 31dB */ + 19,19,20,21,22,23,24, 25, /* 39dB */ + }}, + /* mode A long */ + {{ + 0, 1, 2, 3, 4, 5, 6, 7, /* 7dB */ + 8, 8, 7, 6, 5, 4, 4, 4, /* 15dB */ + 4, 4, 5, 5, 5, 6, 6, 6, /* 23dB */ + 7, 7, 7, 8, 8, 8, 9, 10, /* 31dB */ + 11,12,13,14,15,16,17, 18, /* 39dB */ + }} + }; + + /* tonal masking curve level adjustments *************************/ + static vp_adjblock _vp_tonemask_adj_longblock[11]={ + /* adjust for mode zero */ + /* 63 125 250 500 1 2 4 8 16 */ + {{-15,-15,-15,-15,-10, -8, -4,-2, 0, 0, 0,10, 0, 0, 0, 0, 0}}, /* 0 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 5, 0, 0, 0, 0, 0}}, /* 1 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 3 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 4 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 5 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 6 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 7 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 8 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 9 */ + {{-15,-15,-15,-15,-15,-12,-10,-8, 0, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 10 */ + }; + static vp_adjblock _vp_tonemask_adj_otherblock[11]={ + /* adjust for mode zero */ + /* 63 125 250 500 1 2 4 8 16 */ + {{-20,-20,-20,-20,-14,-12,-10, -8, -4, 0, 0,10, 0, 0, 0, 0, 0}}, /* 0 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 5, 0, 0, 0, 0, 0}}, /* 1 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 2 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 3 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 4 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 5 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 6 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 7 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 8 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 9 */ + {{-20,-20,-20,-20,-20,-18,-16,-14,-10, 0, 0, 0, 0, 0, 0, 0, 0}}, /* 10 */ + }; + + static noise3 _psy_noisebias_trans_low[2]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + /* 0 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 4, 8, 8, 8, 8, 10, 12, 14, 20}, + {-30,-30,-30,-30,-26,-20,-16, -8, -6, -6, -2, 2, 2, 4, 8, 8, 15}, + {-30,-30,-30,-30,-30,-24,-20,-14,-10, -6, -8, -8, -6, -6, -6, -4, -2}}}, + /* 1 */ + {{{-15,-15,-15,-15,-15,-10, -5, 0, 2, 2, 6, 6, 6, 8, 10, 12, 15}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, 0, 0, 0, 2, 4, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}}, + }; + static noise3 _psy_noisebias_long_low[2]={ + /*63 125 250 500 1k 2k 4k 8k 16k*/ + /* 0 */ + {{{-10,-10,-10,-10,-10, -4, 0, 0, 0, 6, 6, 6, 6, 10, 10, 12, 20}, + {-20,-20,-20,-20,-20,-20,-10, -2, 0, 0, 0, 0, 0, 2, 4, 6, 15}, + {-20,-20,-20,-20,-20,-20,-20,-10, -6, -6, -6, -6, -6, -4, -4, -4, -2}}}, + /* 1 */ + {{{-10,-10,-10,-10,-10,-10, -8, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -8, -2, 0, 0, 0, 0, 2, 4, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -6, -6, -6, -6, -6, -4, -4, -4, -2}}}, + }; + + static noise3 _psy_noisebias_trans[11]={ + /* 63 125 250 500 1k 2k 4k 8k 16k*/ + /* 0 */ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14, -8, -4, 0, 0, 0, 0, 2, 4, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -6, -6, -6, -6, -4, -4, -4, -2}}}, + /* 1 */ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, + /* 2 */ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 3 */ + {{{-15,-15,-15,-15,-15,-12,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 4 */ + {{{-20,-20,-20,-20,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, + {-30,-30,-30,-30,-26,-22,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 5 */ + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, + {-34,-34,-34,-34,-30,-24,-24,-18,-14,-12,-12,-12,-12,-10,-10, -9, -5}}}, + /* 6 */ + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-24,-18,-14, -8, -6, -6, -6, -6, -4, -2, 1}, + {-34,-34,-34,-34,-30,-26,-24,-18,-17,-15,-15,-15,-15,-13,-13,-12, -8}}}, + /* 7 */ + {{{-24,-24,-24,-24,-20,-18,-14, -8, -1, 1, 1, 1, 2, 3, 3, 4, 7}, + {-32,-32,-32,-32,-28,-24,-24,-18,-14,-12,-10, -8, -8, -8, -6, -4, 0}, + {-34,-34,-34,-34,-30,-26,-26,-24,-22,-19,-19,-19,-19,-18,-17,-16,-12}}}, + /* 8 */ + {{{-24,-24,-24,-24,-22,-20,-15,-10, -8, -2, 0, 0, 0, 1, 2, 3, 7}, + {-36,-36,-36,-36,-30,-30,-30,-24,-18,-14,-12,-10,-10,-10, -8, -6, -2}, + {-36,-36,-36,-36,-34,-30,-28,-26,-24,-24,-24,-24,-24,-24,-24,-20,-16}}}, + /* 9 */ + {{{-28,-28,-28,-28,-28,-28,-28,-20,-14, -8, -4, -4, -4, -4, -4, -2, 2}, + {-36,-36,-36,-36,-34,-32,-32,-28,-20,-16,-16,-16,-16,-14,-12,-10, -7}, + {-40,-40,-40,-40,-40,-40,-40,-32,-30,-30,-30,-30,-30,-30,-30,-24,-20}}}, + /* 10 */ + {{{-30,-30,-30,-30,-30,-30,-30,-28,-20,-14,-14,-14,-14,-14,-14,-12,-10}, + {-40,-40,-40,-40,-40,-40,-40,-40,-35,-30,-30,-30,-30,-30,-30,-30,-20}, + {-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40,-40}}}, + }; + + static noise3 _psy_noisebias_long[11]={ + /*63 125 250 500 1k 2k 4k 8k 16k*/ + /* 0 */ + {{{-10,-10,-10,-10,-10,-10, -8, 2, 2, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -6, 0, 0, 0, 0, 0, 2, 4, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14, -8, -6, -6, -6, -6, -4, -4, -4, -2}}}, + /* 1 */ + {{{-10,-10,-10,-10,-10,-10, -8, -4, 0, 2, 4, 4, 5, 5, 5, 8, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 8}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -8, -8, -8, -8, -6, -6, -6, -4}}}, + /* 2 */ + {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 5, 6, 10}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -2, -2, -2, -2, 0, 2, 6}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 3 */ + {{{-10,-10,-10,-10,-10,-10,-10, -8, 0, 2, 2, 2, 4, 4, 4, 5, 8}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 6}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 4 */ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10, -4, -3, -3, -3, -3, -1, 1, 5}, + {-20,-20,-20,-20,-20,-20,-20,-14,-10,-10,-10,-10,-10, -8, -8, -8, -4}}}, + /* 5 */ + {{{-15,-15,-15,-15,-15,-15,-15,-10, -4, 1, 1, 1, 2, 3, 3, 4, 7}, + {-22,-22,-22,-22,-22,-22,-22,-16,-12, -6, -4, -4, -4, -4, -2, -1, 2}, + {-24,-24,-24,-24,-24,-24,-24,-18,-14,-12,-12,-12,-12