commit b5e1635fe3eeffd7a90ebe7d779f827c42c0944b Author: Natalia Portillo Date: Sun May 24 23:22:36 2015 +0100 Added version 0.2 from V. diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..94a9ed0 --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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 3 of the License, 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, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..48d420c --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +BINARY := findcrcs + +ifeq ($(OS), Windows_NT) + BINARY := $(BINARY).exe +endif + +all: findcrcs + +clean: + rm $(BINARY) + +findcrcs: findcrcs.cc md5.c md5.h crcutil-1.0 + g++ -O3 -Wall -mcrc32 -o $(BINARY) findcrcs.cc md5.c crcutil-1.0/examples/interface.cc crcutil-1.0/code/*.cc -Icrcutil-1.0/code -Icrcutil-1.0/tests -Icrcutil-1.0/examples + strip $(BINARY) + +crcutil-1.0: crcutil-1.0.tar.gz + tar xfz crcutil-1.0.tar.gz + chmod -R og-w+rX crcutil-1.0 + chown -R 0.0 crcutil-1.0 + touch crcutil-1.0 + +crcutil-1.0.tar.gz: + wget -q -O - http://crcutil.googlecode.com/files/crcutil-1.0.tar.gz > crcutil-1.0.tar.gz + touch crcutil-1.0.tar.gz diff --git a/README b/README new file mode 100644 index 0000000..f420cbf --- /dev/null +++ b/README @@ -0,0 +1,40 @@ +What: + This is a not yet idiotproof version of findcrcs. + It is to be used for finding a block of data which matches a specific crc. + +How: + findcrcs [more crcs...] + + File is a big file which should or may contain the searched for data. + Size of window is the size of the block of data to find. + Crc is the crc to find in the file (may be more then 1, but all will be matched on the window size). + + If a match is found it will print out an md5sum of the matched block for further inspection. + For best results, add some (1MB or so) zero bytes padding around the file first. + In a future version, this might be a selectable option of this program. + +Why: + Useful for finding audio offsets in disk images together with the redump.org database. + +Warning: + This software is not yet idiotproof! + - It does not check arguments for validity yet (especially size of window and crc's.) + - No paddiong option yet. + if matching audiodata, you should pad the combined audiotracks with zero bytes at the start and end. + +Compiling: + Use "make" on any linux/unix/bsd console nearby, or if you must, an msys or cygwin environment. + You need to use a relatively recent gcc (4.5.0+ ish I guess). + This software uses crcutil-1.0 for providing fast crc calculations. + crcutil is made by Andrew Kadatch and Bob Jenkins and can be found on http://code.google.com/p/crcutil/ + Do not contact them for support on findcrcs. + The Makefile will try to pull in version 1.0 through wget if it is not supplied yet. + + Also, this program makes use of the MD5 implementation of Alexander Peslyak. + This is found at http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + A small casting patch was made to support g++, this small patch is released under the same license as the original md5.c file. + +Contact: + At the moment, see the redump.org forum thread where you got this. + +-V. diff --git a/crcutil-1.0.tar.gz b/crcutil-1.0.tar.gz new file mode 100644 index 0000000..d8b71dd Binary files /dev/null and b/crcutil-1.0.tar.gz differ diff --git a/crcutil-1.0/AUTHORS b/crcutil-1.0/AUTHORS new file mode 100644 index 0000000..6443c90 --- /dev/null +++ b/crcutil-1.0/AUTHORS @@ -0,0 +1,4 @@ +Andrew Kadatch +Bob Jenkins + +[The end of the document] diff --git a/crcutil-1.0/COPYING b/crcutil-1.0/COPYING new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/crcutil-1.0/COPYING @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/crcutil-1.0/ChangeLog b/crcutil-1.0/ChangeLog new file mode 100644 index 0000000..ddd60c7 --- /dev/null +++ b/crcutil-1.0/ChangeLog @@ -0,0 +1,4 @@ +10 Dec 2010: + - Version 1.0.0 + +[The end of the document] diff --git a/crcutil-1.0/INSTALL b/crcutil-1.0/INSTALL new file mode 100644 index 0000000..fa074dc --- /dev/null +++ b/crcutil-1.0/INSTALL @@ -0,0 +1,65 @@ +Since crcutil is a library, and rather small, template library, +it is better to compile it directly into your code. Or you could +build a library for interface.cc and use it. + + +Building and running the tests (Linux/GCC, MacOSX/GCC) +------------------------------------------------------ + +Run + ./autogen.sh +or + ./autogen.sh "-m32 -march=i686 " +to build and run 64-bit and 32-bit with GCC. + +Typically, is not required. + +Useful values for are: + clean + configure + check + +E.g. + ./autogen.sh check +will build and run 64-bit unittest, whilst + ./autogen.sh clean +will clean everything up. + + +Why ./autogen.sh? Two reasons: + +1. Automake is well beyond my comprehension, and I am unable to create + "Makefile.am" consistently. So autogen.sh has that piece of black magic. + +2. autogen.sh detects version of GCC and provides different compile options + to work around differences between compiler versions that cannot + be detected at compile time. + +You still can do + ./configure CXXFLAGS="-O3" CFLAGS="-O3" +(if you use GCC before 4.5.0) or + ./configure CXXFLAGS="-O3 -mcrc32" CFLAGS="-O3" +and then run + make check +but the use of "./autogen.sh" is the preferred way to go. + + +Building and running the tests (Windows, CL or ICL compiler) +------------------------------------------------------------ + +Run + nmake -f Makefile.win cl64 +or + nmake -f Makefile.win cl32 +or + nmake -f Makefile.win icl64 +or + nmake -f Makefile.win icl32 +to build and 64-bit and 32-bit unit test using +Microsoft CL and Intel's ICL compilers respectively. + +Run + nmake -f Makefile.win clean +to clean everything up. + +[The end of the document] diff --git a/crcutil-1.0/LICENSE b/crcutil-1.0/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/crcutil-1.0/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/crcutil-1.0/Makefile b/crcutil-1.0/Makefile new file mode 100644 index 0000000..dbf53c6 --- /dev/null +++ b/crcutil-1.0/Makefile @@ -0,0 +1,966 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# Makefile. Generated from Makefile.in by configure. + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + + + + +pkgdatadir = $(datadir)/crcutil +pkgincludedir = $(includedir)/crcutil +pkglibdir = $(libdir)/crcutil +pkglibexecdir = $(libexecdir)/crcutil +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +check_PROGRAMS = crcutil_ut$(EXEEXT) +TESTS = crcutil_ut$(EXEEXT) +tmp_PROGRAMS = usage$(EXEEXT) +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + depcomp install-sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(tmpdir)" +PROGRAMS = $(tmp_PROGRAMS) +am_crcutil_ut_OBJECTS = crc32c_sse4.$(OBJEXT) \ + multiword_128_64_gcc_amd64_sse2.$(OBJEXT) \ + multiword_64_64_cl_i386_mmx.$(OBJEXT) \ + multiword_64_64_gcc_amd64_asm.$(OBJEXT) \ + multiword_64_64_gcc_i386_mmx.$(OBJEXT) set_hi_pri.$(OBJEXT) \ + unittest.$(OBJEXT) +crcutil_ut_OBJECTS = $(am_crcutil_ut_OBJECTS) +crcutil_ut_LDADD = $(LDADD) +am_usage_OBJECTS = usage-crc32c_sse4.$(OBJEXT) \ + usage-multiword_128_64_gcc_amd64_sse2.$(OBJEXT) \ + usage-multiword_64_64_cl_i386_mmx.$(OBJEXT) \ + usage-multiword_64_64_gcc_amd64_asm.$(OBJEXT) \ + usage-multiword_64_64_gcc_i386_mmx.$(OBJEXT) \ + usage-interface.$(OBJEXT) usage-usage.$(OBJEXT) +usage_OBJECTS = $(am_usage_OBJECTS) +usage_LDADD = $(LDADD) +usage_LINK = $(CXXLD) $(usage_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I. +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(crcutil_ut_SOURCES) $(usage_SOURCES) +DIST_SOURCES = $(crcutil_ut_SOURCES) $(usage_SOURCES) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = ${SHELL} /home/akad/crc7/missing --run aclocal-1.11 +AMTAR = ${SHELL} /home/akad/crc7/missing --run tar +AUTOCONF = ${SHELL} /home/akad/crc7/missing --run autoconf +AUTOHEADER = ${SHELL} /home/akad/crc7/missing --run autoheader +AUTOMAKE = ${SHELL} /home/akad/crc7/missing --run automake-1.11 +AWK = gawk +CC = gcc +CCDEPMODE = depmode=gcc3 +CFLAGS = -O3 +CPP = gcc -E +CPPFLAGS = +CXX = g++ +CXXDEPMODE = depmode=gcc3 +CXXFLAGS = -O3 +CYGPATH_W = echo +DEFS = -DHAVE_CONFIG_H +DEPDIR = .deps +ECHO_C = +ECHO_N = -n +ECHO_T = +EGREP = /bin/grep -E +EXEEXT = +GREP = /bin/grep +INSTALL = /usr/bin/install -c +INSTALL_DATA = ${INSTALL} -m 644 +INSTALL_PROGRAM = ${INSTALL} +INSTALL_SCRIPT = ${INSTALL} +INSTALL_STRIP_PROGRAM = $(install_sh) -c -s +LDFLAGS = +LIBOBJS = +LIBS = +LTLIBOBJS = +MAKEINFO = ${SHELL} /home/akad/crc7/missing --run makeinfo +MKDIR_P = /bin/mkdir -p +OBJEXT = o +PACKAGE = crcutil +PACKAGE_BUGREPORT = crcutil@googlegroups.com +PACKAGE_NAME = crcutil +PACKAGE_STRING = crcutil 1.0 +PACKAGE_TARNAME = crcutil +PACKAGE_URL = +PACKAGE_VERSION = 1.0 +PATH_SEPARATOR = : +SET_MAKE = +SHELL = /bin/sh +STRIP = +VERSION = 1.0 +abs_builddir = /home/akad/crc7 +abs_srcdir = /home/akad/crc7 +abs_top_builddir = /home/akad/crc7 +abs_top_srcdir = /home/akad/crc7 +ac_ct_CC = gcc +ac_ct_CXX = g++ +am__include = include +am__leading_dot = . +am__quote = +am__tar = ${AMTAR} chof - "$$tardir" +am__untar = ${AMTAR} xf - +bindir = ${exec_prefix}/bin +build_alias = +builddir = . +datadir = ${datarootdir} +datarootdir = ${prefix}/share +docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} +dvidir = ${docdir} +exec_prefix = ${prefix} +host_alias = +htmldir = ${docdir} +includedir = ${prefix}/include +infodir = ${datarootdir}/info +install_sh = ${SHELL} /home/akad/crc7/install-sh +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/libexec +localedir = ${datarootdir}/locale +localstatedir = ${prefix}/var +mandir = ${datarootdir}/man +mkdir_p = /bin/mkdir -p +oldincludedir = /usr/include +pdfdir = ${docdir} +prefix = /usr/local +program_transform_name = s,x,x, +psdir = ${docdir} +sbindir = ${exec_prefix}/sbin +sharedstatedir = ${prefix}/com +srcdir = . +sysconfdir = ${prefix}/etc +target_alias = +top_build_prefix = +top_builddir = . +top_srcdir = . +AM_CXXFLAGS = -DCRCUTIL_USE_MM_CRC32=1 -Wall -msse2 -Icode +AM_CFLAGS = $(AM_CXXFLAGS) +crcutil_ut_SOURCES = code/base_types.h code/crc32c_sse4.cc code/crc32c_sse4.h code/crc32c_sse4_intrin.h code/crc_casts.h code/generic_crc.h code/gf_util.h code/multiword_128_64_gcc_amd64_sse2.cc code/multiword_64_64_cl_i386_mmx.cc code/multiword_64_64_gcc_amd64_asm.cc code/multiword_64_64_gcc_i386_mmx.cc code/platform.h code/protected_crc.h code/rolling_crc.h code/std_headers.h code/uint128_sse2.h tests/aligned_alloc.h tests/bob_jenkins_rng.h tests/rdtsc.h tests/set_hi_pri.c tests/unittest.cc tests/unittest.h tests/unittest_helper.h +tmpdir = /tmp +usage_CXXFLAGS = $(AM_CXXFLAGS) -Itests +usage_SOURCES = code/base_types.h code/crc32c_sse4.cc code/crc32c_sse4.h code/crc32c_sse4_intrin.h code/crc_casts.h code/generic_crc.h code/gf_util.h code/multiword_128_64_gcc_amd64_sse2.cc code/multiword_64_64_cl_i386_mmx.cc code/multiword_64_64_gcc_amd64_asm.cc code/multiword_64_64_gcc_i386_mmx.cc code/platform.h code/protected_crc.h code/rolling_crc.h code/std_headers.h code/uint128_sse2.h examples/interface.cc examples/interface.h examples/usage.cc tests/aligned_alloc.h +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +install-tmpPROGRAMS: $(tmp_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(tmpdir)" || $(MKDIR_P) "$(DESTDIR)$(tmpdir)" + @list='$(tmp_PROGRAMS)'; test -n "$(tmpdir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tmpdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tmpdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-tmpPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(tmp_PROGRAMS)'; test -n "$(tmpdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(tmpdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(tmpdir)" && rm -f $$files + +clean-tmpPROGRAMS: + -test -z "$(tmp_PROGRAMS)" || rm -f $(tmp_PROGRAMS) +crcutil_ut$(EXEEXT): $(crcutil_ut_OBJECTS) $(crcutil_ut_DEPENDENCIES) + @rm -f crcutil_ut$(EXEEXT) + $(CXXLINK) $(crcutil_ut_OBJECTS) $(crcutil_ut_LDADD) $(LIBS) +usage$(EXEEXT): $(usage_OBJECTS) $(usage_DEPENDENCIES) + @rm -f usage$(EXEEXT) + $(usage_LINK) $(usage_OBJECTS) $(usage_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +include ./$(DEPDIR)/crc32c_sse4.Po +include ./$(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Po +include ./$(DEPDIR)/multiword_64_64_cl_i386_mmx.Po +include ./$(DEPDIR)/multiword_64_64_gcc_amd64_asm.Po +include ./$(DEPDIR)/multiword_64_64_gcc_i386_mmx.Po +include ./$(DEPDIR)/set_hi_pri.Po +include ./$(DEPDIR)/unittest.Po +include ./$(DEPDIR)/usage-crc32c_sse4.Po +include ./$(DEPDIR)/usage-interface.Po +include ./$(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Po +include ./$(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Po +include ./$(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Po +include ./$(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Po +include ./$(DEPDIR)/usage-usage.Po + +.c.o: + $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c $< + +.c.obj: + $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(COMPILE) -c `$(CYGPATH_W) '$<'` + +set_hi_pri.o: tests/set_hi_pri.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set_hi_pri.o -MD -MP -MF $(DEPDIR)/set_hi_pri.Tpo -c -o set_hi_pri.o `test -f 'tests/set_hi_pri.c' || echo '$(srcdir)/'`tests/set_hi_pri.c + $(am__mv) $(DEPDIR)/set_hi_pri.Tpo $(DEPDIR)/set_hi_pri.Po +# source='tests/set_hi_pri.c' object='set_hi_pri.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set_hi_pri.o `test -f 'tests/set_hi_pri.c' || echo '$(srcdir)/'`tests/set_hi_pri.c + +set_hi_pri.obj: tests/set_hi_pri.c + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set_hi_pri.obj -MD -MP -MF $(DEPDIR)/set_hi_pri.Tpo -c -o set_hi_pri.obj `if test -f 'tests/set_hi_pri.c'; then $(CYGPATH_W) 'tests/set_hi_pri.c'; else $(CYGPATH_W) '$(srcdir)/tests/set_hi_pri.c'; fi` + $(am__mv) $(DEPDIR)/set_hi_pri.Tpo $(DEPDIR)/set_hi_pri.Po +# source='tests/set_hi_pri.c' object='set_hi_pri.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ +# $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set_hi_pri.obj `if test -f 'tests/set_hi_pri.c'; then $(CYGPATH_W) 'tests/set_hi_pri.c'; else $(CYGPATH_W) '$(srcdir)/tests/set_hi_pri.c'; fi` + +.cc.o: + $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< + $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: + $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` + $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +# source='$<' object='$@' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +crc32c_sse4.o: code/crc32c_sse4.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc32c_sse4.o -MD -MP -MF $(DEPDIR)/crc32c_sse4.Tpo -c -o crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc + $(am__mv) $(DEPDIR)/crc32c_sse4.Tpo $(DEPDIR)/crc32c_sse4.Po +# source='code/crc32c_sse4.cc' object='crc32c_sse4.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc + +crc32c_sse4.obj: code/crc32c_sse4.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc32c_sse4.obj -MD -MP -MF $(DEPDIR)/crc32c_sse4.Tpo -c -o crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` + $(am__mv) $(DEPDIR)/crc32c_sse4.Tpo $(DEPDIR)/crc32c_sse4.Po +# source='code/crc32c_sse4.cc' object='crc32c_sse4.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` + +multiword_128_64_gcc_amd64_sse2.o: code/multiword_128_64_gcc_amd64_sse2.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_128_64_gcc_amd64_sse2.o -MD -MP -MF $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo -c -o multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc + $(am__mv) $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Po +# source='code/multiword_128_64_gcc_amd64_sse2.cc' object='multiword_128_64_gcc_amd64_sse2.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc + +multiword_128_64_gcc_amd64_sse2.obj: code/multiword_128_64_gcc_amd64_sse2.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_128_64_gcc_amd64_sse2.obj -MD -MP -MF $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo -c -o multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` + $(am__mv) $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Po +# source='code/multiword_128_64_gcc_amd64_sse2.cc' object='multiword_128_64_gcc_amd64_sse2.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` + +multiword_64_64_cl_i386_mmx.o: code/multiword_64_64_cl_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_cl_i386_mmx.o -MD -MP -MF $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo -c -o multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc + $(am__mv) $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_cl_i386_mmx.Po +# source='code/multiword_64_64_cl_i386_mmx.cc' object='multiword_64_64_cl_i386_mmx.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc + +multiword_64_64_cl_i386_mmx.obj: code/multiword_64_64_cl_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_cl_i386_mmx.obj -MD -MP -MF $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo -c -o multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` + $(am__mv) $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_cl_i386_mmx.Po +# source='code/multiword_64_64_cl_i386_mmx.cc' object='multiword_64_64_cl_i386_mmx.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` + +multiword_64_64_gcc_amd64_asm.o: code/multiword_64_64_gcc_amd64_asm.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_amd64_asm.o -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo -c -o multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc + $(am__mv) $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Po +# source='code/multiword_64_64_gcc_amd64_asm.cc' object='multiword_64_64_gcc_amd64_asm.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc + +multiword_64_64_gcc_amd64_asm.obj: code/multiword_64_64_gcc_amd64_asm.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_amd64_asm.obj -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo -c -o multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` + $(am__mv) $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Po +# source='code/multiword_64_64_gcc_amd64_asm.cc' object='multiword_64_64_gcc_amd64_asm.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` + +multiword_64_64_gcc_i386_mmx.o: code/multiword_64_64_gcc_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_i386_mmx.o -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo -c -o multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc + $(am__mv) $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Po +# source='code/multiword_64_64_gcc_i386_mmx.cc' object='multiword_64_64_gcc_i386_mmx.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc + +multiword_64_64_gcc_i386_mmx.obj: code/multiword_64_64_gcc_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_i386_mmx.obj -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo -c -o multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` + $(am__mv) $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Po +# source='code/multiword_64_64_gcc_i386_mmx.cc' object='multiword_64_64_gcc_i386_mmx.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` + +unittest.o: tests/unittest.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT unittest.o -MD -MP -MF $(DEPDIR)/unittest.Tpo -c -o unittest.o `test -f 'tests/unittest.cc' || echo '$(srcdir)/'`tests/unittest.cc + $(am__mv) $(DEPDIR)/unittest.Tpo $(DEPDIR)/unittest.Po +# source='tests/unittest.cc' object='unittest.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o unittest.o `test -f 'tests/unittest.cc' || echo '$(srcdir)/'`tests/unittest.cc + +unittest.obj: tests/unittest.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT unittest.obj -MD -MP -MF $(DEPDIR)/unittest.Tpo -c -o unittest.obj `if test -f 'tests/unittest.cc'; then $(CYGPATH_W) 'tests/unittest.cc'; else $(CYGPATH_W) '$(srcdir)/tests/unittest.cc'; fi` + $(am__mv) $(DEPDIR)/unittest.Tpo $(DEPDIR)/unittest.Po +# source='tests/unittest.cc' object='unittest.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o unittest.obj `if test -f 'tests/unittest.cc'; then $(CYGPATH_W) 'tests/unittest.cc'; else $(CYGPATH_W) '$(srcdir)/tests/unittest.cc'; fi` + +usage-crc32c_sse4.o: code/crc32c_sse4.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-crc32c_sse4.o -MD -MP -MF $(DEPDIR)/usage-crc32c_sse4.Tpo -c -o usage-crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc + $(am__mv) $(DEPDIR)/usage-crc32c_sse4.Tpo $(DEPDIR)/usage-crc32c_sse4.Po +# source='code/crc32c_sse4.cc' object='usage-crc32c_sse4.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc + +usage-crc32c_sse4.obj: code/crc32c_sse4.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-crc32c_sse4.obj -MD -MP -MF $(DEPDIR)/usage-crc32c_sse4.Tpo -c -o usage-crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` + $(am__mv) $(DEPDIR)/usage-crc32c_sse4.Tpo $(DEPDIR)/usage-crc32c_sse4.Po +# source='code/crc32c_sse4.cc' object='usage-crc32c_sse4.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` + +usage-multiword_128_64_gcc_amd64_sse2.o: code/multiword_128_64_gcc_amd64_sse2.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_128_64_gcc_amd64_sse2.o -MD -MP -MF $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo -c -o usage-multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc + $(am__mv) $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Po +# source='code/multiword_128_64_gcc_amd64_sse2.cc' object='usage-multiword_128_64_gcc_amd64_sse2.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc + +usage-multiword_128_64_gcc_amd64_sse2.obj: code/multiword_128_64_gcc_amd64_sse2.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_128_64_gcc_amd64_sse2.obj -MD -MP -MF $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo -c -o usage-multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` + $(am__mv) $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Po +# source='code/multiword_128_64_gcc_amd64_sse2.cc' object='usage-multiword_128_64_gcc_amd64_sse2.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` + +usage-multiword_64_64_cl_i386_mmx.o: code/multiword_64_64_cl_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_cl_i386_mmx.o -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo -c -o usage-multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc + $(am__mv) $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Po +# source='code/multiword_64_64_cl_i386_mmx.cc' object='usage-multiword_64_64_cl_i386_mmx.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc + +usage-multiword_64_64_cl_i386_mmx.obj: code/multiword_64_64_cl_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_cl_i386_mmx.obj -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo -c -o usage-multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` + $(am__mv) $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Po +# source='code/multiword_64_64_cl_i386_mmx.cc' object='usage-multiword_64_64_cl_i386_mmx.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` + +usage-multiword_64_64_gcc_amd64_asm.o: code/multiword_64_64_gcc_amd64_asm.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_amd64_asm.o -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo -c -o usage-multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc + $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Po +# source='code/multiword_64_64_gcc_amd64_asm.cc' object='usage-multiword_64_64_gcc_amd64_asm.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc + +usage-multiword_64_64_gcc_amd64_asm.obj: code/multiword_64_64_gcc_amd64_asm.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_amd64_asm.obj -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo -c -o usage-multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` + $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Po +# source='code/multiword_64_64_gcc_amd64_asm.cc' object='usage-multiword_64_64_gcc_amd64_asm.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` + +usage-multiword_64_64_gcc_i386_mmx.o: code/multiword_64_64_gcc_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_i386_mmx.o -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo -c -o usage-multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc + $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Po +# source='code/multiword_64_64_gcc_i386_mmx.cc' object='usage-multiword_64_64_gcc_i386_mmx.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc + +usage-multiword_64_64_gcc_i386_mmx.obj: code/multiword_64_64_gcc_i386_mmx.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_i386_mmx.obj -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo -c -o usage-multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` + $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Po +# source='code/multiword_64_64_gcc_i386_mmx.cc' object='usage-multiword_64_64_gcc_i386_mmx.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` + +usage-interface.o: examples/interface.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-interface.o -MD -MP -MF $(DEPDIR)/usage-interface.Tpo -c -o usage-interface.o `test -f 'examples/interface.cc' || echo '$(srcdir)/'`examples/interface.cc + $(am__mv) $(DEPDIR)/usage-interface.Tpo $(DEPDIR)/usage-interface.Po +# source='examples/interface.cc' object='usage-interface.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-interface.o `test -f 'examples/interface.cc' || echo '$(srcdir)/'`examples/interface.cc + +usage-interface.obj: examples/interface.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-interface.obj -MD -MP -MF $(DEPDIR)/usage-interface.Tpo -c -o usage-interface.obj `if test -f 'examples/interface.cc'; then $(CYGPATH_W) 'examples/interface.cc'; else $(CYGPATH_W) '$(srcdir)/examples/interface.cc'; fi` + $(am__mv) $(DEPDIR)/usage-interface.Tpo $(DEPDIR)/usage-interface.Po +# source='examples/interface.cc' object='usage-interface.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-interface.obj `if test -f 'examples/interface.cc'; then $(CYGPATH_W) 'examples/interface.cc'; else $(CYGPATH_W) '$(srcdir)/examples/interface.cc'; fi` + +usage-usage.o: examples/usage.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-usage.o -MD -MP -MF $(DEPDIR)/usage-usage.Tpo -c -o usage-usage.o `test -f 'examples/usage.cc' || echo '$(srcdir)/'`examples/usage.cc + $(am__mv) $(DEPDIR)/usage-usage.Tpo $(DEPDIR)/usage-usage.Po +# source='examples/usage.cc' object='usage-usage.o' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-usage.o `test -f 'examples/usage.cc' || echo '$(srcdir)/'`examples/usage.cc + +usage-usage.obj: examples/usage.cc + $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-usage.obj -MD -MP -MF $(DEPDIR)/usage-usage.Tpo -c -o usage-usage.obj `if test -f 'examples/usage.cc'; then $(CYGPATH_W) 'examples/usage.cc'; else $(CYGPATH_W) '$(srcdir)/examples/usage.cc'; fi` + $(am__mv) $(DEPDIR)/usage-usage.Tpo $(DEPDIR)/usage-usage.Po +# source='examples/usage.cc' object='usage-usage.obj' libtool=no \ +# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \ +# $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-usage.obj `if test -f 'examples/usage.cc'; then $(CYGPATH_W) 'examples/usage.cc'; else $(CYGPATH_W) '$(srcdir)/examples/usage.cc'; fi` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) config.h +installdirs: + for dir in "$(DESTDIR)$(tmpdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-tmpPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-tmpPROGRAMS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-tmpPROGRAMS + +.MAKE: all check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \ + clean clean-checkPROGRAMS clean-generic clean-tmpPROGRAMS \ + ctags dist dist-all dist-bzip2 dist-gzip dist-lzma dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + install-tmpPROGRAMS installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-tmpPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/crcutil-1.0/Makefile.am b/crcutil-1.0/Makefile.am new file mode 100644 index 0000000..d622c46 --- /dev/null +++ b/crcutil-1.0/Makefile.am @@ -0,0 +1,9 @@ +AM_CXXFLAGS=-DCRCUTIL_USE_MM_CRC32=1 -Wall -msse2 -Icode +AM_CFLAGS=$(AM_CXXFLAGS) +check_PROGRAMS=crcutil_ut +TESTS=crcutil_ut +crcutil_ut_SOURCES=code/base_types.h code/crc32c_sse4.cc code/crc32c_sse4.h code/crc32c_sse4_intrin.h code/crc_casts.h code/generic_crc.h code/gf_util.h code/multiword_128_64_gcc_amd64_sse2.cc code/multiword_64_64_cl_i386_mmx.cc code/multiword_64_64_gcc_amd64_asm.cc code/multiword_64_64_gcc_i386_mmx.cc code/platform.h code/protected_crc.h code/rolling_crc.h code/std_headers.h code/uint128_sse2.h tests/aligned_alloc.h tests/bob_jenkins_rng.h tests/rdtsc.h tests/set_hi_pri.c tests/unittest.cc tests/unittest.h tests/unittest_helper.h +tmpdir=/tmp +tmp_PROGRAMS=usage +usage_CXXFLAGS=$(AM_CXXFLAGS) -Itests +usage_SOURCES=code/base_types.h code/crc32c_sse4.cc code/crc32c_sse4.h code/crc32c_sse4_intrin.h code/crc_casts.h code/generic_crc.h code/gf_util.h code/multiword_128_64_gcc_amd64_sse2.cc code/multiword_64_64_cl_i386_mmx.cc code/multiword_64_64_gcc_amd64_asm.cc code/multiword_64_64_gcc_i386_mmx.cc code/platform.h code/protected_crc.h code/rolling_crc.h code/std_headers.h code/uint128_sse2.h examples/interface.cc examples/interface.h examples/usage.cc tests/aligned_alloc.h diff --git a/crcutil-1.0/Makefile.in b/crcutil-1.0/Makefile.in new file mode 100644 index 0000000..d22987b --- /dev/null +++ b/crcutil-1.0/Makefile.in @@ -0,0 +1,966 @@ +# Makefile.in generated by automake 1.11.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +check_PROGRAMS = crcutil_ut$(EXEEXT) +TESTS = crcutil_ut$(EXEEXT) +tmp_PROGRAMS = usage$(EXEEXT) +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \ + depcomp install-sh missing +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(tmpdir)" +PROGRAMS = $(tmp_PROGRAMS) +am_crcutil_ut_OBJECTS = crc32c_sse4.$(OBJEXT) \ + multiword_128_64_gcc_amd64_sse2.$(OBJEXT) \ + multiword_64_64_cl_i386_mmx.$(OBJEXT) \ + multiword_64_64_gcc_amd64_asm.$(OBJEXT) \ + multiword_64_64_gcc_i386_mmx.$(OBJEXT) set_hi_pri.$(OBJEXT) \ + unittest.$(OBJEXT) +crcutil_ut_OBJECTS = $(am_crcutil_ut_OBJECTS) +crcutil_ut_LDADD = $(LDADD) +am_usage_OBJECTS = usage-crc32c_sse4.$(OBJEXT) \ + usage-multiword_128_64_gcc_amd64_sse2.$(OBJEXT) \ + usage-multiword_64_64_cl_i386_mmx.$(OBJEXT) \ + usage-multiword_64_64_gcc_amd64_asm.$(OBJEXT) \ + usage-multiword_64_64_gcc_i386_mmx.$(OBJEXT) \ + usage-interface.$(OBJEXT) usage-usage.$(OBJEXT) +usage_OBJECTS = $(am_usage_OBJECTS) +usage_LDADD = $(LDADD) +usage_LINK = $(CXXLD) $(usage_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \ + $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +SOURCES = $(crcutil_ut_SOURCES) $(usage_SOURCES) +DIST_SOURCES = $(crcutil_ut_SOURCES) $(usage_SOURCES) +ETAGS = etags +CTAGS = ctags +am__tty_colors = \ +red=; grn=; lgn=; blu=; std= +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d "$(distdir)" \ + || { find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr "$(distdir)"; }; } +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GREP = @GREP@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CXXFLAGS = -DCRCUTIL_USE_MM_CRC32=1 -Wall -msse2 -Icode +AM_CFLAGS = $(AM_CXXFLAGS) +crcutil_ut_SOURCES = code/base_types.h code/crc32c_sse4.cc code/crc32c_sse4.h code/crc32c_sse4_intrin.h code/crc_casts.h code/generic_crc.h code/gf_util.h code/multiword_128_64_gcc_amd64_sse2.cc code/multiword_64_64_cl_i386_mmx.cc code/multiword_64_64_gcc_amd64_asm.cc code/multiword_64_64_gcc_i386_mmx.cc code/platform.h code/protected_crc.h code/rolling_crc.h code/std_headers.h code/uint128_sse2.h tests/aligned_alloc.h tests/bob_jenkins_rng.h tests/rdtsc.h tests/set_hi_pri.c tests/unittest.cc tests/unittest.h tests/unittest_helper.h +tmpdir = /tmp +usage_CXXFLAGS = $(AM_CXXFLAGS) -Itests +usage_SOURCES = code/base_types.h code/crc32c_sse4.cc code/crc32c_sse4.h code/crc32c_sse4_intrin.h code/crc_casts.h code/generic_crc.h code/gf_util.h code/multiword_128_64_gcc_amd64_sse2.cc code/multiword_64_64_cl_i386_mmx.cc code/multiword_64_64_gcc_amd64_asm.cc code/multiword_64_64_gcc_i386_mmx.cc code/platform.h code/protected_crc.h code/rolling_crc.h code/std_headers.h code/uint128_sse2.h examples/interface.cc examples/interface.h examples/usage.cc tests/aligned_alloc.h +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .cc .o .obj +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +install-tmpPROGRAMS: $(tmp_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(tmpdir)" || $(MKDIR_P) "$(DESTDIR)$(tmpdir)" + @list='$(tmp_PROGRAMS)'; test -n "$(tmpdir)" || list=; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p; \ + then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(tmpdir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(tmpdir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-tmpPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(tmp_PROGRAMS)'; test -n "$(tmpdir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(tmpdir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(tmpdir)" && rm -f $$files + +clean-tmpPROGRAMS: + -test -z "$(tmp_PROGRAMS)" || rm -f $(tmp_PROGRAMS) +crcutil_ut$(EXEEXT): $(crcutil_ut_OBJECTS) $(crcutil_ut_DEPENDENCIES) + @rm -f crcutil_ut$(EXEEXT) + $(CXXLINK) $(crcutil_ut_OBJECTS) $(crcutil_ut_LDADD) $(LIBS) +usage$(EXEEXT): $(usage_OBJECTS) $(usage_DEPENDENCIES) + @rm -f usage$(EXEEXT) + $(usage_LINK) $(usage_OBJECTS) $(usage_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crc32c_sse4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiword_64_64_cl_i386_mmx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiword_64_64_gcc_amd64_asm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/multiword_64_64_gcc_i386_mmx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/set_hi_pri.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unittest.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-crc32c_sse4.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-interface.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/usage-usage.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +set_hi_pri.o: tests/set_hi_pri.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set_hi_pri.o -MD -MP -MF $(DEPDIR)/set_hi_pri.Tpo -c -o set_hi_pri.o `test -f 'tests/set_hi_pri.c' || echo '$(srcdir)/'`tests/set_hi_pri.c +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/set_hi_pri.Tpo $(DEPDIR)/set_hi_pri.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tests/set_hi_pri.c' object='set_hi_pri.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set_hi_pri.o `test -f 'tests/set_hi_pri.c' || echo '$(srcdir)/'`tests/set_hi_pri.c + +set_hi_pri.obj: tests/set_hi_pri.c +@am__fastdepCC_TRUE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT set_hi_pri.obj -MD -MP -MF $(DEPDIR)/set_hi_pri.Tpo -c -o set_hi_pri.obj `if test -f 'tests/set_hi_pri.c'; then $(CYGPATH_W) 'tests/set_hi_pri.c'; else $(CYGPATH_W) '$(srcdir)/tests/set_hi_pri.c'; fi` +@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/set_hi_pri.Tpo $(DEPDIR)/set_hi_pri.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='tests/set_hi_pri.c' object='set_hi_pri.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o set_hi_pri.obj `if test -f 'tests/set_hi_pri.c'; then $(CYGPATH_W) 'tests/set_hi_pri.c'; else $(CYGPATH_W) '$(srcdir)/tests/set_hi_pri.c'; fi` + +.cc.o: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` + +crc32c_sse4.o: code/crc32c_sse4.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc32c_sse4.o -MD -MP -MF $(DEPDIR)/crc32c_sse4.Tpo -c -o crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/crc32c_sse4.Tpo $(DEPDIR)/crc32c_sse4.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/crc32c_sse4.cc' object='crc32c_sse4.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc + +crc32c_sse4.obj: code/crc32c_sse4.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT crc32c_sse4.obj -MD -MP -MF $(DEPDIR)/crc32c_sse4.Tpo -c -o crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/crc32c_sse4.Tpo $(DEPDIR)/crc32c_sse4.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/crc32c_sse4.cc' object='crc32c_sse4.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` + +multiword_128_64_gcc_amd64_sse2.o: code/multiword_128_64_gcc_amd64_sse2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_128_64_gcc_amd64_sse2.o -MD -MP -MF $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo -c -o multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_128_64_gcc_amd64_sse2.cc' object='multiword_128_64_gcc_amd64_sse2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc + +multiword_128_64_gcc_amd64_sse2.obj: code/multiword_128_64_gcc_amd64_sse2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_128_64_gcc_amd64_sse2.obj -MD -MP -MF $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo -c -o multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/multiword_128_64_gcc_amd64_sse2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_128_64_gcc_amd64_sse2.cc' object='multiword_128_64_gcc_amd64_sse2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` + +multiword_64_64_cl_i386_mmx.o: code/multiword_64_64_cl_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_cl_i386_mmx.o -MD -MP -MF $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo -c -o multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_cl_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_cl_i386_mmx.cc' object='multiword_64_64_cl_i386_mmx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc + +multiword_64_64_cl_i386_mmx.obj: code/multiword_64_64_cl_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_cl_i386_mmx.obj -MD -MP -MF $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo -c -o multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_cl_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_cl_i386_mmx.cc' object='multiword_64_64_cl_i386_mmx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` + +multiword_64_64_gcc_amd64_asm.o: code/multiword_64_64_gcc_amd64_asm.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_amd64_asm.o -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo -c -o multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_amd64_asm.cc' object='multiword_64_64_gcc_amd64_asm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc + +multiword_64_64_gcc_amd64_asm.obj: code/multiword_64_64_gcc_amd64_asm.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_amd64_asm.obj -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo -c -o multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/multiword_64_64_gcc_amd64_asm.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_amd64_asm.cc' object='multiword_64_64_gcc_amd64_asm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` + +multiword_64_64_gcc_i386_mmx.o: code/multiword_64_64_gcc_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_i386_mmx.o -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo -c -o multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_i386_mmx.cc' object='multiword_64_64_gcc_i386_mmx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc + +multiword_64_64_gcc_i386_mmx.obj: code/multiword_64_64_gcc_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT multiword_64_64_gcc_i386_mmx.obj -MD -MP -MF $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo -c -o multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/multiword_64_64_gcc_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_i386_mmx.cc' object='multiword_64_64_gcc_i386_mmx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` + +unittest.o: tests/unittest.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT unittest.o -MD -MP -MF $(DEPDIR)/unittest.Tpo -c -o unittest.o `test -f 'tests/unittest.cc' || echo '$(srcdir)/'`tests/unittest.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/unittest.Tpo $(DEPDIR)/unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/unittest.cc' object='unittest.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o unittest.o `test -f 'tests/unittest.cc' || echo '$(srcdir)/'`tests/unittest.cc + +unittest.obj: tests/unittest.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT unittest.obj -MD -MP -MF $(DEPDIR)/unittest.Tpo -c -o unittest.obj `if test -f 'tests/unittest.cc'; then $(CYGPATH_W) 'tests/unittest.cc'; else $(CYGPATH_W) '$(srcdir)/tests/unittest.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/unittest.Tpo $(DEPDIR)/unittest.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='tests/unittest.cc' object='unittest.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o unittest.obj `if test -f 'tests/unittest.cc'; then $(CYGPATH_W) 'tests/unittest.cc'; else $(CYGPATH_W) '$(srcdir)/tests/unittest.cc'; fi` + +usage-crc32c_sse4.o: code/crc32c_sse4.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-crc32c_sse4.o -MD -MP -MF $(DEPDIR)/usage-crc32c_sse4.Tpo -c -o usage-crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-crc32c_sse4.Tpo $(DEPDIR)/usage-crc32c_sse4.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/crc32c_sse4.cc' object='usage-crc32c_sse4.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-crc32c_sse4.o `test -f 'code/crc32c_sse4.cc' || echo '$(srcdir)/'`code/crc32c_sse4.cc + +usage-crc32c_sse4.obj: code/crc32c_sse4.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-crc32c_sse4.obj -MD -MP -MF $(DEPDIR)/usage-crc32c_sse4.Tpo -c -o usage-crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-crc32c_sse4.Tpo $(DEPDIR)/usage-crc32c_sse4.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/crc32c_sse4.cc' object='usage-crc32c_sse4.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-crc32c_sse4.obj `if test -f 'code/crc32c_sse4.cc'; then $(CYGPATH_W) 'code/crc32c_sse4.cc'; else $(CYGPATH_W) '$(srcdir)/code/crc32c_sse4.cc'; fi` + +usage-multiword_128_64_gcc_amd64_sse2.o: code/multiword_128_64_gcc_amd64_sse2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_128_64_gcc_amd64_sse2.o -MD -MP -MF $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo -c -o usage-multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_128_64_gcc_amd64_sse2.cc' object='usage-multiword_128_64_gcc_amd64_sse2.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_128_64_gcc_amd64_sse2.o `test -f 'code/multiword_128_64_gcc_amd64_sse2.cc' || echo '$(srcdir)/'`code/multiword_128_64_gcc_amd64_sse2.cc + +usage-multiword_128_64_gcc_amd64_sse2.obj: code/multiword_128_64_gcc_amd64_sse2.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_128_64_gcc_amd64_sse2.obj -MD -MP -MF $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo -c -o usage-multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Tpo $(DEPDIR)/usage-multiword_128_64_gcc_amd64_sse2.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_128_64_gcc_amd64_sse2.cc' object='usage-multiword_128_64_gcc_amd64_sse2.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_128_64_gcc_amd64_sse2.obj `if test -f 'code/multiword_128_64_gcc_amd64_sse2.cc'; then $(CYGPATH_W) 'code/multiword_128_64_gcc_amd64_sse2.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_128_64_gcc_amd64_sse2.cc'; fi` + +usage-multiword_64_64_cl_i386_mmx.o: code/multiword_64_64_cl_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_cl_i386_mmx.o -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo -c -o usage-multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_cl_i386_mmx.cc' object='usage-multiword_64_64_cl_i386_mmx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_cl_i386_mmx.o `test -f 'code/multiword_64_64_cl_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_cl_i386_mmx.cc + +usage-multiword_64_64_cl_i386_mmx.obj: code/multiword_64_64_cl_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_cl_i386_mmx.obj -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo -c -o usage-multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_cl_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_cl_i386_mmx.cc' object='usage-multiword_64_64_cl_i386_mmx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_cl_i386_mmx.obj `if test -f 'code/multiword_64_64_cl_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_cl_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_cl_i386_mmx.cc'; fi` + +usage-multiword_64_64_gcc_amd64_asm.o: code/multiword_64_64_gcc_amd64_asm.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_amd64_asm.o -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo -c -o usage-multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_amd64_asm.cc' object='usage-multiword_64_64_gcc_amd64_asm.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_amd64_asm.o `test -f 'code/multiword_64_64_gcc_amd64_asm.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_amd64_asm.cc + +usage-multiword_64_64_gcc_amd64_asm.obj: code/multiword_64_64_gcc_amd64_asm.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_amd64_asm.obj -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo -c -o usage-multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_amd64_asm.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_amd64_asm.cc' object='usage-multiword_64_64_gcc_amd64_asm.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_amd64_asm.obj `if test -f 'code/multiword_64_64_gcc_amd64_asm.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_amd64_asm.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_amd64_asm.cc'; fi` + +usage-multiword_64_64_gcc_i386_mmx.o: code/multiword_64_64_gcc_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_i386_mmx.o -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo -c -o usage-multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_i386_mmx.cc' object='usage-multiword_64_64_gcc_i386_mmx.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_i386_mmx.o `test -f 'code/multiword_64_64_gcc_i386_mmx.cc' || echo '$(srcdir)/'`code/multiword_64_64_gcc_i386_mmx.cc + +usage-multiword_64_64_gcc_i386_mmx.obj: code/multiword_64_64_gcc_i386_mmx.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-multiword_64_64_gcc_i386_mmx.obj -MD -MP -MF $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo -c -o usage-multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Tpo $(DEPDIR)/usage-multiword_64_64_gcc_i386_mmx.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='code/multiword_64_64_gcc_i386_mmx.cc' object='usage-multiword_64_64_gcc_i386_mmx.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-multiword_64_64_gcc_i386_mmx.obj `if test -f 'code/multiword_64_64_gcc_i386_mmx.cc'; then $(CYGPATH_W) 'code/multiword_64_64_gcc_i386_mmx.cc'; else $(CYGPATH_W) '$(srcdir)/code/multiword_64_64_gcc_i386_mmx.cc'; fi` + +usage-interface.o: examples/interface.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-interface.o -MD -MP -MF $(DEPDIR)/usage-interface.Tpo -c -o usage-interface.o `test -f 'examples/interface.cc' || echo '$(srcdir)/'`examples/interface.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-interface.Tpo $(DEPDIR)/usage-interface.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='examples/interface.cc' object='usage-interface.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-interface.o `test -f 'examples/interface.cc' || echo '$(srcdir)/'`examples/interface.cc + +usage-interface.obj: examples/interface.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-interface.obj -MD -MP -MF $(DEPDIR)/usage-interface.Tpo -c -o usage-interface.obj `if test -f 'examples/interface.cc'; then $(CYGPATH_W) 'examples/interface.cc'; else $(CYGPATH_W) '$(srcdir)/examples/interface.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-interface.Tpo $(DEPDIR)/usage-interface.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='examples/interface.cc' object='usage-interface.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-interface.obj `if test -f 'examples/interface.cc'; then $(CYGPATH_W) 'examples/interface.cc'; else $(CYGPATH_W) '$(srcdir)/examples/interface.cc'; fi` + +usage-usage.o: examples/usage.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-usage.o -MD -MP -MF $(DEPDIR)/usage-usage.Tpo -c -o usage-usage.o `test -f 'examples/usage.cc' || echo '$(srcdir)/'`examples/usage.cc +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-usage.Tpo $(DEPDIR)/usage-usage.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='examples/usage.cc' object='usage-usage.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-usage.o `test -f 'examples/usage.cc' || echo '$(srcdir)/'`examples/usage.cc + +usage-usage.obj: examples/usage.cc +@am__fastdepCXX_TRUE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -MT usage-usage.obj -MD -MP -MF $(DEPDIR)/usage-usage.Tpo -c -o usage-usage.obj `if test -f 'examples/usage.cc'; then $(CYGPATH_W) 'examples/usage.cc'; else $(CYGPATH_W) '$(srcdir)/examples/usage.cc'; fi` +@am__fastdepCXX_TRUE@ $(am__mv) $(DEPDIR)/usage-usage.Tpo $(DEPDIR)/usage-usage.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='examples/usage.cc' object='usage-usage.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(usage_CXXFLAGS) $(CXXFLAGS) -c -o usage-usage.obj `if test -f 'examples/usage.cc'; then $(CYGPATH_W) 'examples/usage.cc'; else $(CYGPATH_W) '$(srcdir)/examples/usage.cc'; fi` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + set x; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in files) print i; }; }'`; \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +check-TESTS: $(TESTS) + @failed=0; all=0; xfail=0; xpass=0; skip=0; \ + srcdir=$(srcdir); export srcdir; \ + list=' $(TESTS) '; \ + $(am__tty_colors); \ + if test -n "$$list"; then \ + for tst in $$list; do \ + if test -f ./$$tst; then dir=./; \ + elif test -f $$tst; then dir=; \ + else dir="$(srcdir)/"; fi; \ + if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xpass=`expr $$xpass + 1`; \ + failed=`expr $$failed + 1`; \ + col=$$red; res=XPASS; \ + ;; \ + *) \ + col=$$grn; res=PASS; \ + ;; \ + esac; \ + elif test $$? -ne 77; then \ + all=`expr $$all + 1`; \ + case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$tst[\ \ ]*) \ + xfail=`expr $$xfail + 1`; \ + col=$$lgn; res=XFAIL; \ + ;; \ + *) \ + failed=`expr $$failed + 1`; \ + col=$$red; res=FAIL; \ + ;; \ + esac; \ + else \ + skip=`expr $$skip + 1`; \ + col=$$blu; res=SKIP; \ + fi; \ + echo "$${col}$$res$${std}: $$tst"; \ + done; \ + if test "$$all" -eq 1; then \ + tests="test"; \ + All=""; \ + else \ + tests="tests"; \ + All="All "; \ + fi; \ + if test "$$failed" -eq 0; then \ + if test "$$xfail" -eq 0; then \ + banner="$$All$$all $$tests passed"; \ + else \ + if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \ + banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \ + fi; \ + else \ + if test "$$xpass" -eq 0; then \ + banner="$$failed of $$all $$tests failed"; \ + else \ + if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \ + banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \ + fi; \ + fi; \ + dashes="$$banner"; \ + skipped=""; \ + if test "$$skip" -ne 0; then \ + if test "$$skip" -eq 1; then \ + skipped="($$skip test was not run)"; \ + else \ + skipped="($$skip tests were not run)"; \ + fi; \ + test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$skipped"; \ + fi; \ + report=""; \ + if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \ + report="Please report to $(PACKAGE_BUGREPORT)"; \ + test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \ + dashes="$$report"; \ + fi; \ + dashes=`echo "$$dashes" | sed s/./=/g`; \ + if test "$$failed" -eq 0; then \ + echo "$$grn$$dashes"; \ + else \ + echo "$$red$$dashes"; \ + fi; \ + echo "$$banner"; \ + test -z "$$skipped" || echo "$$skipped"; \ + test -z "$$report" || echo "$$report"; \ + echo "$$dashes$$std"; \ + test "$$failed" -eq 0; \ + else :; fi + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-lzma: distdir + tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma + $(am__remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz + $(am__remove_distdir) + +dist-tarZ: distdir + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lzma*) \ + lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @$(am__cd) '$(distuninstallcheck_dir)' \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) config.h +installdirs: + for dir in "$(DESTDIR)$(tmpdir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-checkPROGRAMS clean-generic clean-tmpPROGRAMS \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-tmpPROGRAMS + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-tmpPROGRAMS + +.MAKE: all check-am install-am install-strip + +.PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \ + clean clean-checkPROGRAMS clean-generic clean-tmpPROGRAMS \ + ctags dist dist-all dist-bzip2 dist-gzip dist-lzma dist-shar \ + dist-tarZ dist-xz dist-zip distcheck distclean \ + distclean-compile distclean-generic distclean-hdr \ + distclean-tags distcleancheck distdir distuninstallcheck dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-dvi install-dvi-am \ + install-exec install-exec-am install-html install-html-am \ + install-info install-info-am install-man install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + install-tmpPROGRAMS installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-tmpPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/crcutil-1.0/Makefile.win b/crcutil-1.0/Makefile.win new file mode 100644 index 0000000..fb5f69b --- /dev/null +++ b/crcutil-1.0/Makefile.win @@ -0,0 +1,79 @@ +Makefile=Makefile.win + +CL_FLAGS=-Wall -O2 -nologo -DCRCUTIL_USE_MM_CRC32=0 +ICL_FLAGS=-Wall -O3 -Qdiag-disable:181 -Qdiag-disable:185 -Qdiag-disable:442 -Qdiag-disable:vec -DCRCUTIL_USE_MM_CRC32=0 +INCLUDES=-Icode + +all: + @echo Please run "nmake target" where "target" is one of: + @echo cl64 - 64-bit Microsoft compiler + @echo cl32 - 32-bit Microsoft compiler + @echo icl64 - 64-bit Intel compiler + @echo icl32 - 32-bit Intel compiler + + +cl64: + @call "%VCINSTALLDIR%\bin\amd64\vcvarsamd64.bat" && nmake -nologo -f $(Makefile) CC_FLAGS="$(CL_FLAGS) -Icode -Itests" CC=cl.exe configured + +cl32: + @call "%VCINSTALLDIR%\bin\vcvars32.bat" && nmake -nologo -f $(Makefile) CC_FLAGS="$(CL_FLAGS) -Icode -Itests" CC=cl.exe configured + +icl64: + @call "%ICPP_COMPILER11%bin\iclvars.bat" intel64 && nmake -nologo -f $(Makefile) CC_FLAGS="$(ICL_FLAGS) -Icode -Itests" CC=icl.exe configured + +icl32: + @call "%ICPP_COMPILER11%bin\iclvars.bat" ia32 && nmake -nologo -f $(Makefile) CC_FLAGS="$(ICL_FLAGS) -Icode -Itests" CC=icl.exe configured + + +clean: + del /q *.obj *.asm *.exe *.pdb *.suo + + +TARGETS=unittest.exe example.exe + +COMMON_CODE=\ + code/crc32c_sse4.cc \ + code/multiword_64_64_cl_i386_mmx.cc + +COMMON_HEADERS=\ + code/base_types.h \ + code/crc32c_sse4.h \ + code/crc32c_sse4_intrin.h \ + code/crc_casts.h \ + code/generic_crc.h \ + code/gf_util.h \ + code/platform.h \ + code/protected_crc.h \ + code/rolling_crc.h \ + code/std_headers.h \ + code/uint128_sse2.h + +UNITTEST_CODE=\ + tests/unittest.cc \ + tests/set_hi_pri.c \ + $(COMMON_CODE) + +UNITTEST_HEADERS=\ + tests/aligned_alloc.h \ + tests/bob_jenkins_rng.h \ + tests/rdtsc.h \ + tests/unittest.h \ + tests/unittest_helper.h \ + $(COMMON_HEADERS) + +EXAMPLE_CODE=\ + examples/usage.cc \ + examples/interface.cc \ + $(COMMON_CODE) + +EXAMPLE_HEADERS=\ + examples/interface.h \ + $(COMMON_HEADERS) + +configured: $(TARGETS) + +unittest.exe: $(Makefile) $(UNITTEST_CODE) $(UNITTEST_HEADERS) + $(CC) $(CC_FLAGS) $(UNITTEST_CODE) + +example.exe: $(Makefile) $(EXAMPLE_CODE) $(EXAMPLE_HEADERS) + $(CC) $(CC_FLAGS) -Iexamples $(EXAMPLE_CODE) diff --git a/crcutil-1.0/NEWS b/crcutil-1.0/NEWS new file mode 100644 index 0000000..89de0e2 --- /dev/null +++ b/crcutil-1.0/NEWS @@ -0,0 +1,3 @@ +10 Jan 2010: automake is working + +[The end of the document] diff --git a/crcutil-1.0/README b/crcutil-1.0/README new file mode 100644 index 0000000..712ba24 --- /dev/null +++ b/crcutil-1.0/README @@ -0,0 +1,185 @@ +Goals +----- + +1. Performance. In distributed systems the data is CRC'ed + on every breath in and out, and often multiple times. + Having entire cluster spend 10% of all CPU computing + CRCs is not something unheard of. + +2. Functionality. Computing CRC is not enough. Oftentimes, + distributed systems need to perform various operations + using known CRC values (concatenation, data replacement, + etc.) without touching the actual data. + +3. Functionality verification: ability to catch even the most + subtle bugs in CRC implementation. + +4. Performance benchmarking: ability to evaluate performance + of known CRC algorithms and choose the right one for given + architecture and/or compiler. + +5. Support most popular and most advanced CPUs [typically + used in distributed environments]. That is, AMD64 and X86. + +6. Support most popular compilers used to compile code running + in distributed environments. That is, Microsoft's CL, GCC, + and Intel's ICL. + +7. Ability to easily (at run-time) create CRCs for arbitrary + generating polynomials. Many complex projects have to deal + with multiple CRC generating polynomials. Adding support + yet another one should be 1-line change, not 2-week journey. + + +Caveats +------- + +1. Only little-endian CPUs are supported. Reason: all the + optimizations makes sense only when CPU has multiple ALUs + and may execute multiple instructions in parallel. I cannot + easily recall big-endian CPUs like that (probably PPC and + IBM's Z-series?) -- and, unless CPU is powerful enough, + trivial byte-by-byte Sarwate algorithm is hard to beat. + +2. The only CPUs the code was tested are AMD64 and X86 family. + I do not have access to Itanium. I tried to do my best to + allow the code to work on Itanium as is, but I will not + be very surprised if I overlooked something. + + +How it all works +---------------- + +Please read crc.pdf in "docs" directory -- it explains, slowly, +step-by-step, how it all works, and provides small listings +of respective algorithms that (hopefully, clearly) demonstrate +how specific algorithm is implemented -- actual implementation +is heavily optimized, a lot of loops are unrolled, and comments +explain only the most subtle details of implementation. + + +Usage +----- + +"unittest.cc" is standalone unit test which perform extensive +functionality validation and also tests performance of key scenarios. +Please keep in mind that it takes almost a minute for GCC to compile +it. Full performance test takes a couple of hours. + +"generic_crc.h" provides a set of implemenations of generic CRCs. +"crc32c*" set of files implements CRC using Intel's CRC32 instruction. +"multiword*" set of files implements specialized -- and heavily +optimized -- versions of multiword CRC. + +However, including these files directly into your project may be +a bad idea -- there is a lot of quite heavy-weight template code +that you probably do not want to see included into every file that +uses CRCs. + +Instead, use "interface.h" which hides all the details of the +implementation. It declares on namespace, two types in that +namespace, and brings in a couple of standard ANSI C headers. + +Another advantage of using "interface.h" is that actual +implementation will pick the most efficient implementation +of CRC for specific platform and compiler (applies to +AMD64 and X86 platform and CL, ICL, and GCC compilers only). + +Please see "usage.cc" which provides an example how to use +crcutil_interface::CRC class. + + +Compiler optimization settings +------------------------------ + +Recommended compiler flags: +CL: -O2 -Wall +ICL: -O3 -Wall -Qdiag-disable:181 -Qdiag-disable:185 -Qdiag-disable:442 -Qdiag-disable:vec +GCC 4.5+: -O3 -Wall -msse2 -mcrc32 +GCC 4.4-, AMD64: -O3 -Wall -msse2 -DCRCUTIL_USE_MM_CRC32=1 +GCC 4.4-, I386: -O3 -Wall -msse2 -DCRCUTIL_USE_MM_CRC32=1 -fomit-frame-pointer + + +Compile-time constants +---------------------- + +CRCUTIL_USE_ASM + Allows the use of inline ASM for GCC on AMD64 and I386 platforms, + 32-bit Intel and Microsoft compilers on Windows. + + See multiword*.cc files. + + By default, turned on. + + +HAVE_MMX + MMX and respective intrinsics are available. When MMX is available, it + will be used on I386 platform to speed up computation of up to 64-bit + CRCs (1.3 CPU cycles/byte, see see *i386_mmx.cc files). + + By default, enabled on AMD64 and I386 platforms, disabled otherwise. + + +HAVE_SSE + By default, enabled on AMD64 and I386 platforms, disabled otherwise. + + +HAVE_SSE2 + By default, enabled on AMD64 and I386 platforms, disabled otherwise. + + Allows the use of SSE2 instructions to compute 128-bit CRCs efficiently + (see uint128_sse2.h, multiword_128_64_gcc_amd64_sse2.cc). + + +CRCUTIL_PREFETCH_WIDTH + Prefetch width (default is 0 -- read platform.h to see why). + + When CRCUTIL_PREFETCH_WIDTH > 0 and HAVE_SSE, the code will try to + prefetch CRCUTIL_PREFETCH_WIDTH bytes ahead. + + +CRCUTIL_MIN_ALIGN_SIZE + Align input pointer on word boundary when input length exceeds + CRCUTIL_MIN_ALIGN_SIZE bytes and when CRC implementation will read + input data by words. + + Non-AMD64/I386 do not allow misaligned reads, so default value of + CRCUTIL_MIN_ALIGN_SIZE is 0. + + On AMD64 and I386 platforms, default value is 1KB. Even though AMD64 + and I386 allow non-aligned reads, crossing cache line boundary is not + free, and it makes sense to align large inputs first before processing + them (see generic_crc.h for more details). + + +CRCUTIL_USE_MM_CRC32 + Allows the use SSE4.2 crc32 instruction when computing CRC32C (0.13 CPU + cycles per byte, see crc32c_sse4* files). + + If set to false (i.e. 0), _mm_crc32_u*() intrinsics will be simulated + (useful for debugging crc32_sse4 code on machines that do not support + SSE 4.2). + + Hardware-assisted CRC32C is supported on AMD64 and I386 platforms only. + + By default, enabled for Windows and for "g++ -msse4". + + With GCC 4.5, it is possible to compile the code using "-msse2 -mcrc32 + -DCRCUTIL_USE_MM_CRC32=1" flags. + + GCC 4.4 and earlier do not support "-mcrc32" flag, but it is still + possible to use crc32c_sse4 code by compiling the code using "-msse2 + -DCRCUTIL_USE_MM_CRC32=1" flags. In this case, inline asm code will be + used (see crc32c_sse4_intrin.h). + + +CRCUTIL_FORCE_ASM_CRC32C + GCC 4.4 and earlier versions do not have -mcrc32 flag, so + _mm_crc32_u64/32/8 intrinsics there are not available from standard + headers. They are replaced by inline asm code (see + crc32c_sse4_intrin.h). To test backward compatibility using GCC 4.5+, + use "-Wall -O3 -msse2 --DCRCUTIL_USE_MM_CRC32=1 + -DCRCUTIL_FORCE_ASM_CRC32C=1". + + +[The end of the document] diff --git a/crcutil-1.0/aclocal.m4 b/crcutil-1.0/aclocal.m4 new file mode 100644 index 0000000..e9b7b28 --- /dev/null +++ b/crcutil-1.0/aclocal.m4 @@ -0,0 +1,951 @@ +# generated automatically by aclocal 1.11.1 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],, +[m4_warning([this file was generated for autoconf 2.65. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically `autoreconf'.])]) + +# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.11' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.11.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.11.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 9 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 10 + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], UPC, [depcc="$UPC" am_compiler_list=], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +#serial 5 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, +# 2005, 2006, 2008, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 16 + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.62])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES(OBJC)], + [define([AC_PROG_OBJC], + defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl +]) +_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl +dnl The `parallel-tests' driver may need to know about EXEEXT, so add the +dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This macro +dnl is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl +]) + +dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST(install_sh)]) + +# Copyright (C) 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2009 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 6 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_MKDIR_P +# --------------- +# Check for `mkdir -p'. +AC_DEFUN([AM_PROG_MKDIR_P], +[AC_PREREQ([2.60])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, +dnl while keeping a definition of mkdir_p for backward compatibility. +dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. +dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of +dnl Makefile.ins that do not define MKDIR_P, so we do our own +dnl adjustment using top_builddir (which is defined more often than +dnl MKDIR_P). +AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl +case $mkdir_p in + [[\\/$]]* | ?:[[\\/]]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 4 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008 +# Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 5 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006, 2008 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004, 2005 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# serial 2 + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of `v7', `ustar', or `pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. +AM_MISSING_PROG([AMTAR], [tar]) +m4_if([$1], [v7], + [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], + [m4_case([$1], [ustar],, [pax],, + [m4_fatal([Unknown tar format])]) +AC_MSG_CHECKING([how to create a $1 tar archive]) +# Loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' +_am_tools=${am_cv_prog_tar_$1-$_am_tools} +# Do not fold the above two line into one, because Tru64 sh and +# Solaris sh will not grok spaces in the rhs of `-'. +for _am_tool in $_am_tools +do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; + do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi +done +rm -rf conftest.dir + +AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) +AC_MSG_RESULT([$am_cv_prog_tar_$1])]) +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/crcutil-1.0/autogen.sh b/crcutil-1.0/autogen.sh new file mode 100755 index 0000000..dc6cd16 --- /dev/null +++ b/crcutil-1.0/autogen.sh @@ -0,0 +1,110 @@ +#!/bin/bash + +# See http://mij.oltrelinux.com/devel/autoconf-automake/ + +if [ -f "Makefile" ] && [ -f "Makefile.am" ] && [ -f "Makefile.in" ] && [ -d ".deps" ] ; then + make clean +fi + +echo "Removing old garbage" +if [ "${1}" != "clean" ] || [ "${2}" == "clean" ]; then +# "./mk.sh clean" leave all the files needed for "./configure && make". +# "./mk.sh clean clean" deletes them as well. +# Full clean build starts from removing all generated files. + rm -f Makefile + rm -f Makefile.am + rm -f Makefile.in + rm -f aclocal.m4 + rm -f config.h.in + rm -f configure + rm -f configure.ac + rm -f depcomp + rm -f install-sh + rm -f missing +fi + +rm -f autoscan.log +rm -f config.h +rm -f config.log +rm -f config.status +rm -f stamp-h1 +if [ -d "autom4te.cache" ]; then + rm -r autom4te.cache +fi +if [ -d ".deps" ]; then + rm -r .deps +fi + +if [ "${1}" == "clean" ]; then + exit +fi + +echo "Generating preliminary configure.ac" +autoscan + +sed 's/^AC_INIT(.*$/AC_INIT(crcutil, 1.0, crcutil@googlegroups.com)\ +AM_INIT_AUTOMAKE(crcutil, 1.0)\ +AC_CONFIG_FILES([Makefile]) \ +AC_OUTPUT()/' configure.scan >configure.ac + +# AC_OUTPUT(Makefile)/' configure.scan >configure.ac +rm -f configure.scan + +echo "Generating final configure.ac" +aclocal +autoconf + +echo "Generating config.h.in" +autoheader + +target=./Makefile.am +echo "Generating ${target}" +echo>${target} "AUTOMAKE_OPTIONS=foreign" + +# --pedantic -std=c99? +crcutil_flags="-DCRCUTIL_USE_MM_CRC32=1 -Wall -msse2 -Icode" +echo>${target} "AM_CXXFLAGS=${crcutil_flags}" +if [ "$(uname -a | grep ^Darwin)" == "" ] && [[ "$(c++ -dumpversion)" > "4.4.9" ]]; then + # Static linking is not supported on Mac OS X. + # Use static linking on Linux, otherwise GCC 4.5.0 linker produces + # obscure warning (well, the code works but nevertheless). + echo>>${target} "AM_LDFLAGS=-static" +fi +echo>>${target} 'AM_CFLAGS=$(AM_CXXFLAGS)' +echo>>${target} "check_PROGRAMS=crcutil_ut" +echo>>${target} "TESTS=crcutil_ut" +sources=$(ls tests/*.cc tests/*.c tests/*.h code/*.cc code/*.h | grep -v intrinsic | tr "\n" " ") +echo>>${target} "crcutil_ut_SOURCES=${sources}" + +echo>>${target} "tmpdir=/tmp" +echo>>${target} "tmp_PROGRAMS=usage" +echo>>${target} 'usage_CXXFLAGS=$(AM_CXXFLAGS) -Itests' +sources=$(ls examples/*.cc examples/*.h code/*.cc code/*.h tests/aligned_alloc.h | grep -v intrinsic | tr "\n" " ") +echo>>${target} "usage_SOURCES=${sources}" + +echo "Creating Makefile.in" +aclocal +automake --add-missing +autoconf + +cflags="-O3" +if [[ "$(c++ -dumpversion)" > "4.4.9" ]]; then + cflags="${cflags} -mcrc32" +fi + +cflags="${cflags} $2" + +./configure CXXFLAGS="${cflags}" CFLAGS="${cflags}" + +echo "" +echo "Configured the library. Compiler flags:" +echo " ${cflags}" +echo "Library configuration flags:" +echo " ${crcutil_flags}" +echo "" + +if [ "${1}" == "configure" ]; then + exit +fi + +make $1 diff --git a/crcutil-1.0/code/base_types.h b/crcutil-1.0/code/base_types.h new file mode 100644 index 0000000..5b74364 --- /dev/null +++ b/crcutil-1.0/code/base_types.h @@ -0,0 +1,73 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Defines 8/16/32/64-bit integer types. +// +// Either uint64 or uint32 will map to size_t. +// This way, specialized variants of CRC implementation +// parameterized by "size_t" will be reused when +// parameterized by "uint64" or "uint32". +// In their turn, specialized verisons are parameterized +// by "size_t" so that one version of the code is optimal +// both on 32-bit and 64-bit platforms. + +#ifndef CRCUTIL_BASE_TYPES_H_ +#define CRCUTIL_BASE_TYPES_H_ + +#include "std_headers.h" // size_t, ptrdiff_t + +namespace crcutil { + +template class ChooseFirstIfSame { + public: + template class ChooseFirstIfTrue { + public: + typedef AA Type; + }; + template class ChooseFirstIfTrue { + public: + typedef BB Type; + }; + + typedef typename ChooseFirstIfTrue::Type Type; +}; + +typedef unsigned char uint8; +typedef signed char int8; + +typedef unsigned short uint16; +typedef short int16; + +typedef ChooseFirstIfSame::Type uint32; +typedef ChooseFirstIfSame::Type int32; + +#if defined(_MSC_VER) +typedef ChooseFirstIfSame::Type uint64; +typedef ChooseFirstIfSame::Type int64; +#define HAVE_UINT64 1 +#elif defined(__GNUC__) +typedef ChooseFirstIfSame::Type uint64; +typedef ChooseFirstIfSame::Type int64; +#define HAVE_UINT64 1 +#else +// TODO: ensure that everything compiles and works when HAVE_UINT64 is false. +// TODO: remove HAVE_UINT64 and use sizeof(uint64) instead? +#define HAVE_UINT64 0 +typedef uint32 uint64; +typedef int32 int64; +#endif + +} // namespace crcutil + +#endif // CRCUTIL_BASE_TYPES_H_ diff --git a/crcutil-1.0/code/crc32c_sse4.cc b/crcutil-1.0/code/crc32c_sse4.cc new file mode 100644 index 0000000..c6e1652 --- /dev/null +++ b/crcutil-1.0/code/crc32c_sse4.cc @@ -0,0 +1,366 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements CRC32C using Intel's SSE4 crc32 instruction. +// Uses _mm_crc32_u64/32/8 intrinsics if CRCUTIL_USE_MM_CRC32 is not zero, +// emilates intrinsics via CRC_WORD/CRC_BYTE otherwise. + +#include "crc32c_sse4.h" + +#if HAVE_I386 || HAVE_AMD64 + +namespace crcutil { + +#define UPDATE_STRIPE_CRCS(index, block_size, num_stripes) do { \ + CRC_UPDATE_WORD(crc0, \ + reinterpret_cast(src + \ + 0 * CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes))[index]); \ + CRC_UPDATE_WORD(crc1, \ + reinterpret_cast(src + \ + 1 * CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes))[index]); \ + CRC_UPDATE_WORD(crc2, \ + reinterpret_cast(src + \ + 2 * CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes))[index]); \ + if (num_stripes > 3) { \ + CRC_UPDATE_WORD(crc3, \ + reinterpret_cast(src + \ + 3 * CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes))[index]); \ + } \ +} while (0) + +// Multiplies "crc" by "x**(8 * STRIPE_SIZE(block_size)" +// using appropriate multiplication table(s). +// +#if 0 + +// This variant is for illustration purposes only. +// Actual implementation below: +// 1. Splits the computation into 2 data-independent paths +// by independently multiplying lower and upper halves +// of "crc0" in interleaved manner, and combining the +// results in the end. +// 2. Removing redundant "crc0 = 0" etc. in the beginning. +// 3. Removing redundant shifts of "tmp0" and "tmp1" in the last round. +#define MULTIPLY_CRC(crc0, block_size, num_stripes) do { \ + size_t tmp0 = crc0; \ + crc0 = 0; \ + for (size_t i = 0; i < kNumTables; ++i) { \ + crc0 ^= CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [i][tmp0 & (kTableEntries - 1)]; \ + tmp0 >>= kTableEntryBits; \ + } \ +} while (0) + +#else + +#define MULTIPLY_CRC(crc0, block_size, num_stripes) do { \ + size_t tmp0 = crc0; \ + size_t tmp1 = crc0 >> (kTableEntryBits * kNumTablesHalfHi); \ + crc0 = CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [0][tmp0 & (kTableEntries - 1)]; \ + tmp0 >>= kTableEntryBits; \ + size_t crc1 = CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [kNumTablesHalfHi][tmp1 & (kTableEntries - 1)]; \ + tmp1 >>= kTableEntryBits; \ + for (size_t i = 1; i < kNumTablesHalfLo - 1; ++i) { \ + crc0 ^= CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [i][tmp0 & (kTableEntries - 1)]; \ + tmp0 >>= kTableEntryBits; \ + crc1 ^= CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [i + kNumTablesHalfHi][tmp1 & (kTableEntries - 1)]; \ + tmp1 >>= kTableEntryBits; \ + } \ + crc0 ^= CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [kNumTablesHalfLo - 1][tmp0 & (kTableEntries - 1)]; \ + if (kNumTables & 1) { \ + tmp0 >>= kTableEntryBits; \ + } \ + crc1 ^= CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [kNumTables - 1][tmp1]; \ + if (kNumTables & 1) { \ + crc0 ^= CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [kNumTablesHalfLo][tmp0 & (kTableEntries - 1)]; \ + } \ + crc0 ^= crc1; \ +} while (0) + +#endif + +// Given CRCs (crc0, crc1, etc.) of consequitive +// stripes of STRIPE_SIZE(block_size) bytes each, +// produces CRC of concatenated stripes. +#define COMBINE_STRIPE_CRCS(block_size, num_stripes) do { \ + MULTIPLY_CRC(crc0, block_size, num_stripes); \ + crc0 ^= crc1; \ + MULTIPLY_CRC(crc0, block_size, num_stripes); \ + crc0 ^= crc2; \ + if (num_stripes > 3) { \ + MULTIPLY_CRC(crc0, block_size, num_stripes); \ + crc0 ^= crc3; \ + } \ +} while (0) + +// Processes input BLOCK_SIZE(block) bytes per iteration +// by splitting a block of BLOCK_SIZE(block) bytes into N +// equally-sized stripes of STRIPE_SIZE(block_size) each, +// computing CRC of each stripe, and concatenating stripe CRCs. +#define PROCESS_BLOCK(block_size, num_stripes) do { \ + while (bytes >= CRC32C_SSE4_BLOCK_SIZE(block_size, num_stripes)) { \ + Crc crc1 = 0; \ + Crc crc2 = 0; \ + Crc crc3; \ + if (num_stripes > 3) crc3 = 0; \ + { \ + const uint8 *stripe_end = src + \ + (CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes) / \ + kUnrolledLoopBytes) * kUnrolledLoopBytes; \ + do { \ + UPDATE_STRIPE_CRCS(0, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(1, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(2, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(3, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(4, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(5, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(6, block_size, num_stripes); \ + UPDATE_STRIPE_CRCS(7, block_size, num_stripes); \ + src += kUnrolledLoopBytes; \ + } while (src < stripe_end); \ + if ((CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes) % \ + kUnrolledLoopBytes) != 0) { \ + stripe_end += \ + CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes) % \ + kUnrolledLoopBytes; \ + do { \ + UPDATE_STRIPE_CRCS(0, block_size, num_stripes); \ + src += sizeof(size_t); \ + } while (src < stripe_end); \ + } \ + } \ + COMBINE_STRIPE_CRCS(block_size, num_stripes); \ + src += CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes) * \ + ((num_stripes) - 1); \ + bytes = static_cast(end - src); \ + } \ + no_more_##block_size##_##num_stripes:; \ +} while (0) + +size_t Crc32cSSE4::Crc32c(const void *data, size_t bytes, Crc crc0) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + crc0 ^= Base().Canonize(); + + // If we don't have too much data to process, + // do not waste time trying to align input etc. + // Noticeably improves performance on small inputs. + if (bytes < 4 * sizeof(size_t)) goto less_than_4_size_t; + if (bytes < 8 * sizeof(size_t)) goto less_than_8_size_t; + if (bytes < 16 * sizeof(size_t)) goto less_than_16_size_t; + +#define PROCESS_TAIL_IF_SMALL(block_size, num_stripes) do { \ + if (bytes < CRC32C_SSE4_BLOCK_SIZE(block_size, num_stripes)) { \ + goto no_more_##block_size##_##num_stripes; \ + } \ +} while (0) +#define NOOP(block_size, num_stripes) + + CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_ASCENDING(PROCESS_TAIL_IF_SMALL, + NOOP, + NOOP); + +#undef PROCESS_TAIL_IF_SMALL + + + // Do not use ALIGN_ON_WORD_BOUNDARY_IF_NEEDED() here because: + // 1. It uses CRC_BYTE() which won't work. + // 2. Its threshold may be incorrect becuase Crc32 that uses + // native CPU crc32 instruction is much faster than + // generic table-based CRC computation. + // + // In case of X5550 CPU, break even point is at 2KB -- exactly. + if (bytes >= 2 * 1024) { + while ((reinterpret_cast(src) & (sizeof(Word) - 1)) != 0) { + if (src >= end) { + return (crc0 ^ Base().Canonize()); + } + CRC_UPDATE_BYTE(crc0, src[0]); + src += 1; + } + bytes = static_cast(end - src); + } + if (src >= end) { + return (crc0 ^ Base().Canonize()); + } + + // Quickly skip processing of too large blocks + // Noticeably improves performance on small inputs. +#define SKIP_BLOCK_IF_NEEDED(block_size, num_stripes) do { \ + if (bytes < CRC32C_SSE4_BLOCK_SIZE(block_size, num_stripes)) { \ + goto no_more_##block_size##_##num_stripes; \ + } \ +} while (0) + + CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_ASCENDING(NOOP, + SKIP_BLOCK_IF_NEEDED, + SKIP_BLOCK_IF_NEEDED); + +#undef SKIP_BLOCK_IF_NEEDED + + // Process data in all blocks. + CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_DESCENDING(PROCESS_BLOCK, + PROCESS_BLOCK, + PROCESS_BLOCK); + + // Finish the tail word-by-word and then byte-by-byte. +#define CRC_UPDATE_WORD_4(index) do { \ + CRC_UPDATE_WORD(crc0, reinterpret_cast(src)[index]); \ + CRC_UPDATE_WORD(crc0, reinterpret_cast(src)[index + 1]); \ + CRC_UPDATE_WORD(crc0, reinterpret_cast(src)[index + 2]); \ + CRC_UPDATE_WORD(crc0, reinterpret_cast(src)[index + 3]); \ +} while (0) + + if (bytes >= 4 * 4 * sizeof(size_t)) { + end -= 4 * 4 * sizeof(size_t); + do { + CRC_UPDATE_WORD_4(4 * 0); + CRC_UPDATE_WORD_4(4 * 1); + CRC_UPDATE_WORD_4(4 * 2); + CRC_UPDATE_WORD_4(4 * 3); + src += 4 * 4 * sizeof(size_t); + } while (src <= end); + end += 4 * 4 * sizeof(size_t); + bytes = static_cast(end - src); + } + less_than_16_size_t: + + if (bytes >= 4 * 2 * sizeof(size_t)) { + CRC_UPDATE_WORD_4(4 * 0); + CRC_UPDATE_WORD_4(4 * 1); + src += 4 * 2 * sizeof(size_t); + bytes -= 4 * 2 * sizeof(size_t); + } + less_than_8_size_t: + + if (bytes >= 4 * sizeof(size_t)) { + CRC_UPDATE_WORD_4(0); + src += 4 * sizeof(size_t); + bytes -= 4 * sizeof(size_t); + } + less_than_4_size_t: + + if (bytes >= 1 * sizeof(size_t)) { + end -= 1 * sizeof(size_t); + do { + CRC_UPDATE_WORD(crc0, reinterpret_cast(src)[0]); + src += 1 * sizeof(size_t); + } while (src <= end); + end += 1 * sizeof(size_t); + } + + while (src < end) { + CRC_UPDATE_BYTE(crc0, src[0]); + src += 1; + } + + return (crc0 ^ Base().Canonize()); +} + + +void Crc32cSSE4::Init(bool constant) { + base_.Init(FixedGeneratingPolynomial(), FixedDegree(), constant); + +#define INIT_MUL_TABLE(block_size, num_stripes) do { \ + size_t multiplier = \ + Base().Xpow8N(CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes)); \ + for (size_t table = 0; table < kNumTables; ++table) { \ + for (size_t entry = 0; entry < kTableEntries; ++entry) { \ + size_t value = static_cast(entry << (kTableEntryBits * table)); \ + CRC32C_SSE4_MUL_TABLE(block_size, num_stripes)[table][entry] = \ + static_cast(Base().Multiply(value, multiplier)); \ + } \ + } \ +} while (0) + + CRC32C_SSE4_ENUMERATE_ALL_BLOCKS(INIT_MUL_TABLE); + +#undef INIT_MUL_TABLE + +#if !CRCUTIL_USE_MM_CRC32 + for (size_t j = 0; j < sizeof(Word); ++j) { + Crc k = Base().XpowN((sizeof(Word) - 1 - j) * 8 + 32); + for (size_t i = 0; i < 256; ++i) { + crc_word_[j][i] = Base().MultiplyUnnormalized(i, 8, k); + } + } +#endif // !CRCUTIL_USE_MM_CRC32 +} + + +bool Crc32cSSE4::IsSSE42Available() { +#if defined(_MSC_VER) + int cpu_info[4]; + __cpuid(cpu_info, 1); + return ((cpu_info[3] & (1 << 20)) != 0); +#elif defined(__GNUC__) && (HAVE_AMD64 || HAVE_I386) + // Not using "cpuid.h" intentionally: it is missing from + // too many installations. + uint32 eax; + uint32 ecx; + uint32 edx; + __asm__ volatile( +#if HAVE_I386 && defined(__PIC__) + "push ebx\n" + "cpuid\n" + "pop ebx\n" +#else + "cpuid\n" +#endif // HAVE_I386 && defined(__PIC__) + : "=a" (eax), "=c" (ecx), "=d" (edx) + : "a" (1), "2" (0) + : "%ebx" + ); + return ((ecx & (1 << 20)) != 0); +#else + return false; +#endif +} + + +void RollingCrc32cSSE4::Init(const Crc32cSSE4 &crc, + size_t roll_window_bytes, + const Crc &start_value) { + crc_ = &crc; + roll_window_bytes_ = roll_window_bytes; + start_value_ = start_value; + + Crc add = crc.Base().Canonize() ^ start_value; + add = crc.Base().Multiply(add, crc.Base().Xpow8N(roll_window_bytes)); + add ^= crc.Base().Canonize(); + Crc mul = crc.Base().One() ^ crc.Base().Xpow8N(1); + add = crc.Base().Multiply(add, mul); + + mul = crc.Base().XpowN(8 * roll_window_bytes + crc.Base().Degree()); + for (size_t i = 0; i < 256; ++i) { + out_[i] = static_cast( + crc.Base().MultiplyUnnormalized( + static_cast(i), 8, mul) ^ add); + } + +#if !CRCUTIL_USE_MM_CRC32 + memcpy(crc_word_, crc_->crc_word_, sizeof(crc_word_)); +#endif // !CRCUTIL_USE_MM_CRC32 +} + +} // namespace crcutil + +#endif // HAVE_I386 || HAVE_AMD64 diff --git a/crcutil-1.0/code/crc32c_sse4.h b/crcutil-1.0/code/crc32c_sse4.h new file mode 100644 index 0000000..ac3d842 --- /dev/null +++ b/crcutil-1.0/code/crc32c_sse4.h @@ -0,0 +1,252 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements CRC32C using Intel's SSE4 crc32 instruction. +// Uses _mm_crc32_u64/32/8 intrinsics if CRCUTIL_USE_MM_CRC32 is not zero, +// emilates intrinsics via CRC_WORD/CRC_BYTE otherwise. + +#ifndef CRCUTIL_CRC32C_SSE4_H_ +#define CRCUTIL_CRC32C_SSE4_H_ + +#include "gf_util.h" // base types, gf_util class, etc. +#include "crc32c_sse4_intrin.h" // _mm_crc32_u* intrinsics + +#if HAVE_I386 || HAVE_AMD64 + +#if CRCUTIL_USE_MM_CRC32 + +#if HAVE_I386 +#define CRC_UPDATE_WORD(crc, value) (crc = _mm_crc32_u32(crc, (value))) +#else +#define CRC_UPDATE_WORD(crc, value) (crc = _mm_crc32_u64(crc, (value))) +#endif // HAVE_I386 + +#define CRC_UPDATE_BYTE(crc, value) \ + (crc = _mm_crc32_u8(static_cast(crc), static_cast(value))) + +#else + +#include "generic_crc.h" + +#define CRC_UPDATE_WORD(crc, value) do { \ + size_t buf = (value); \ + CRC_WORD(this, crc, buf); \ +} while (0) +#define CRC_UPDATE_BYTE(crc, value) do { \ + CRC_BYTE(this, crc, (value)); \ +} while (0) + +#endif // CRCUTIL_USE_MM_CRC32 + +namespace crcutil { + +#pragma pack(push, 16) + +// Since the same pieces should be parameterized in many different places +// and we do not want to introduce a mistake which is rather hard to find, +// use a macro to enumerate all block sizes. +// +// Block sizes and number of stripes were tuned for best performance. +// +// All constants should be literal constants (too lazy to fix the macro). +// +// The use of different "macro_first", "macro", and "macro_last" +// allows generation of different code for smallest, in between, +// and largest block sizes. +// +// This macro shall be kept in sync with +// CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_DESCENDING. +// Failure to do so will cause compile-time error. +#define CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_ASCENDING( \ + macro_smallest, macro, macro_largest) \ + macro_smallest(512, 3); \ + macro(1024, 3); \ + macro(4096, 3); \ + macro_largest(32768, 3) + +// This macro shall be kept in sync with +// CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_ASCENDING. +// Failure to do so will cause compile-time error. +#define CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_DESCENDING( \ + macro_smallest, macro, macro_largest) \ + macro_largest(32768, 3); \ + macro(4096, 3); \ + macro(1024, 3); \ + macro_smallest(512, 3) + +// Enumerates all block sizes. +#define CRC32C_SSE4_ENUMERATE_ALL_BLOCKS(macro) \ + CRC32C_SSE4_ENUMERATE_ALL_BLOCKS_ASCENDING(macro, macro, macro) + +#define CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes) \ + (((block_size) / (num_stripes)) & ~(sizeof(size_t) - 1)) + +#define CRC32C_SSE4_BLOCK_SIZE(block_size, num_stripes) \ + (CRC32C_SSE4_STRIPE_SIZE(block_size, num_stripes) * (num_stripes)) + +#define CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + mul_table_##block_size##_##num_blocks##_ + +class RollingCrc32cSSE4; + +class Crc32cSSE4 { + public: + // Exports Crc, TableEntry, and Word (needed by RollingCrc). + typedef size_t Crc; + typedef Crc Word; + typedef Crc TableEntry; + + Crc32cSSE4() {} + + // Initializes the tables given generating polynomial of degree (degree). + // If "canonical" is true, crc value will be XOR'ed with (-1) before and + // after actual CRC computation. + explicit Crc32cSSE4(bool canonical) { + Init(canonical); + } + void Init(bool canonical); + + // Initializes the tables given generating polynomial of degree. + // If "canonical" is true, crc value will be XOR'ed with (-1) before and + // after actual CRC computation. + // Provided for compatibility with GenericCrc. + Crc32cSSE4(const Crc &generating_polynomial, + size_t degree, + bool canonical) { + Init(generating_polynomial, degree, canonical); + } + void Init(const Crc &generating_polynomial, + size_t degree, + bool canonical) { + if (generating_polynomial == FixedGeneratingPolynomial() && + degree == FixedDegree()) { + Init(canonical); + } + } + + // Returns fixed generating polymonial the class implements. + static Crc FixedGeneratingPolynomial() { + return 0x82f63b78; + } + + // Returns degree of fixed generating polymonial the class implements. + static Crc FixedDegree() { + return 32; + } + + // Returns base class. + const GfUtil &Base() const { return base_; } + + // Computes CRC32. + size_t CrcDefault(const void *data, size_t bytes, const Crc &crc) const { + return Crc32c(data, bytes, crc); + } + + // Returns true iff crc32 instruction is available. + static bool IsSSE42Available(); + + protected: + // Actual implementation. + size_t Crc32c(const void *data, size_t bytes, Crc crc) const; + + enum { + kTableEntryBits = 8, + kTableEntries = 1 << kTableEntryBits, + kNumTables = (32 + kTableEntryBits - 1) / kTableEntryBits, + kNumTablesHalfLo = kNumTables / 2, + kNumTablesHalfHi = (kNumTables + 1) / 2, + + kUnrolledLoopCount = 8, + kUnrolledLoopBytes = kUnrolledLoopCount * sizeof(size_t), + }; + + // May be set to size_t or uint32, whichever is faster. + typedef uint32 Entry; + +#define DECLARE_MUL_TABLE(block_size, num_stripes) \ + Entry CRC32C_SSE4_MUL_TABLE(block_size, num_stripes) \ + [kNumTables][kTableEntries] + + CRC32C_SSE4_ENUMERATE_ALL_BLOCKS(DECLARE_MUL_TABLE); + +#undef DECLARE_MUL_TABLE + + GfUtil base_; + +#if !CRCUTIL_USE_MM_CRC32 + TableEntry crc_word_[sizeof(Word)][256]; + friend class RollingCrc32cSSE4; +#endif // !CRCUTIL_USE_MM_CRC32 +} GCC_ALIGN_ATTRIBUTE(16); + +class RollingCrc32cSSE4 { + public: + typedef Crc32cSSE4::Crc Crc; + typedef Crc32cSSE4::TableEntry TableEntry; + typedef Crc32cSSE4::Word Word; + + RollingCrc32cSSE4() {} + + // Initializes internal data structures. + // Retains reference to "crc" instance -- it is used by Start(). + RollingCrc32cSSE4(const Crc32cSSE4 &crc, + size_t roll_window_bytes, + const Crc &start_value) { + Init(crc, roll_window_bytes, start_value); + } + void Init(const Crc32cSSE4 &crc, + size_t roll_window_bytes, + const Crc &start_value); + + // Computes crc of "roll_window_bytes" using + // "start_value" of "crc" (see Init()). + Crc Start(const void *data) const { + return crc_->CrcDefault(data, roll_window_bytes_, start_value_); + } + + // Computes CRC of "roll_window_bytes" starting in next position. + Crc Roll(const Crc &old_crc, size_t byte_out, size_t byte_in) const { + Crc crc = old_crc; + CRC_UPDATE_BYTE(crc, byte_in); + crc ^= out_[byte_out]; + return crc; + } + + // Returns start value. + Crc StartValue() const { return start_value_; } + + // Returns length of roll window. + size_t WindowBytes() const { return roll_window_bytes_; } + + protected: + typedef Crc Entry; + Entry out_[256]; + + // Used only by Start(). + Crc start_value_; + const Crc32cSSE4 *crc_; + size_t roll_window_bytes_; + +#if !CRCUTIL_USE_MM_CRC32 + TableEntry crc_word_[sizeof(Word)][256]; +#endif // !CRCUTIL_USE_MM_CRC32 +} GCC_ALIGN_ATTRIBUTE(16); + +#pragma pack(pop) + +} // namespace crcutil + +#endif // HAVE_I386 || HAVE_AMD64 + +#endif // CRCUTIL_CRC32C_SSE4_H_ diff --git a/crcutil-1.0/code/crc32c_sse4_intrin.h b/crcutil-1.0/code/crc32c_sse4_intrin.h new file mode 100644 index 0000000..ab7cc3e --- /dev/null +++ b/crcutil-1.0/code/crc32c_sse4_intrin.h @@ -0,0 +1,99 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Provides _mm_crc32_u64/32/8 intrinsics. + +#ifndef CRCUTIL_CRC32C_SSE4_INTRIN_H_ +#define CRCUTIL_CRC32C_SSE4_INTRIN_H_ + +#include "platform.h" +#include "base_types.h" + +#if CRCUTIL_USE_MM_CRC32 && (HAVE_I386 || HAVE_AMD64) + +#if defined(_MSC_VER) || defined(__SSE4_2__) + +#if defined(_MSC_VER) +#pragma warning(push) +// '_M_IA64' is not defined as a preprocessor macro +#pragma warning(disable: 4668) +#endif // defined(_MSC_VER) + +#include + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif // defined(_MSC_VER) + +#elif GCC_VERSION_AVAILABLE(4, 5) && !defined(CRCUTIL_FORCE_ASM_CRC32C) +// Allow the use of _mm_crc32_u* intrinsic when CRCUTIL_USE_MM_CRC32 +// is set irrespective of "-msse*" settings. This way, the sources +// may be compiled with "-msse2 -mcrc32" and work on older CPUs, +// while taking full advantage of "crc32" instruction on newer +// CPUs (requires dynamic CPU detection). See "interface.cc". +// +// If neither -msse4 or -mcrc32 is provided and CRCUTIL_USE_MM_CRC32 is set +// and CRCUTIL_FORCE_ASM_CRC32 is not set, compile-time error will happen. +// Why? Becuase GCC disables __builtin_ia32_crc32* intrinsics when compiled +// without -msse4 or -mcrc32. -msse4 could be detected at run time by checking +// whether __SSE4_2__ is defined, but there is no way to tell whether the +// sources are compiled with -mcrc32. + +extern __inline unsigned int __attribute__(( + __gnu_inline__, __always_inline__, __artificial__)) +_mm_crc32_u8(unsigned int __C, unsigned char __V) { + return __builtin_ia32_crc32qi(__C, __V); +} +#ifdef __x86_64__ +extern __inline unsigned long long __attribute__(( + __gnu_inline__, __always_inline__, __artificial__)) +_mm_crc32_u64(unsigned long long __C, unsigned long long __V) { + return __builtin_ia32_crc32di(__C, __V); +} +#else +extern __inline unsigned int __attribute__(( + __gnu_inline__, __always_inline__, __artificial__)) +_mm_crc32_u32(unsigned int __C, unsigned int __V) { + return __builtin_ia32_crc32si (__C, __V); +} +#endif // __x86_64__ + +#else + +// GCC 4.4.x and earlier: use inline asm. + +namespace crcutil { + +__forceinline uint64 _mm_crc32_u64(uint64 crc, uint64 value) { + asm("crc32q %[value], %[crc]\n" : [crc] "+r" (crc) : [value] "rm" (value)); + return crc; +} + +__forceinline uint32 _mm_crc32_u32(uint32 crc, uint64 value) { + asm("crc32l %[value], %[crc]\n" : [crc] "+r" (crc) : [value] "rm" (value)); + return crc; +} + +__forceinline uint32 _mm_crc32_u8(uint32 crc, uint8 value) { + asm("crc32b %[value], %[crc]\n" : [crc] "+r" (crc) : [value] "rm" (value)); + return crc; +} + +} // namespace crcutil + +#endif + +#endif // CRCUTIL_USE_MM_CRC32 && (HAVE_I386 || HAVE_AMD64) + +#endif // CRCUTIL_CRC32C_SSE4_INTRIN_H_ diff --git a/crcutil-1.0/code/crc_casts.h b/crcutil-1.0/code/crc_casts.h new file mode 100644 index 0000000..a14044f --- /dev/null +++ b/crcutil-1.0/code/crc_casts.h @@ -0,0 +1,68 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Casting between integers and compound CRC types. + +#ifndef CRCUTIL_CRC_CASTS_H_ +#define CRCUTIL_CRC_CASTS_H_ + +#include "base_types.h" // uint8, uint64 +#include "platform.h" // __forceinline + +namespace crcutil { + +// Downcasts a value of (oftentimes larger) Crc type to (smaller base integer) +// Result type, enabling specialized downcasts implemented by "large integer" +// classes (e.g. uint128_sse2). +template +__forceinline Result Downcast(const Crc &x) { + return static_cast(x); +} + +// Extracts 8 least significant bits from a value of Crc type. +#define TO_BYTE(x) Downcast(x) + +// Converts a pair of uint64 bit values into single value of CRC type. +// It is caller's responsibility to ensure that the input is correct. +template +__forceinline Crc CrcFromUint64(uint64 lo, uint64 hi = 0) { + if (sizeof(Crc) <= sizeof(lo)) { + return static_cast(lo); + } else { + // static_cast to keep compiler happy. + Crc result = static_cast(hi); + result = SHIFT_LEFT_SAFE(result, 8 * sizeof(lo)); + result ^= lo; + return result; + } +} + +// Converts Crc value to a pair of uint64 values. +template +__forceinline void Uint64FromCrc(const Crc &crc, + uint64 *lo, uint64 *hi = NULL) { + if (sizeof(*lo) >= sizeof(crc)) { + *lo = Downcast(crc); + if (hi != NULL) { + *hi = 0; + } + } else { + *lo = Downcast(crc); + *hi = Downcast(SHIFT_RIGHT_SAFE(crc, 8 * sizeof(lo))); + } +} + +} // namespace crcutil + +#endif // CRCUTIL_CRC_CASTS_H_ diff --git a/crcutil-1.0/code/generic_crc.h b/crcutil-1.0/code/generic_crc.h new file mode 100644 index 0000000..06af21c --- /dev/null +++ b/crcutil-1.0/code/generic_crc.h @@ -0,0 +1,687 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Defines GenericCrc class which implements arbitrary CRCs. +// +// Please read crc.pdf to understand how it all works. + +#ifndef CRCUTIL_GENERIC_CRC_H_ +#define CRCUTIL_GENERIC_CRC_H_ + +#include "base_types.h" // uint8 +#include "crc_casts.h" // TO_BYTE(), Downcast<>. +#include "gf_util.h" // GfUtil class. +#include "platform.h" // GCC_ALIGN_ATTRIBUTE(16) +#include "uint128_sse2.h" // uint128_sse2 type (if necessary) + +namespace crcutil { + +#pragma pack(push, 16) + +// Extends CRC by one byte. +// Technically, if degree of a polynomial does not exceed 8, +// right shift by 8 bits is not required, but who cares about CRC-8? +#define CRC_BYTE(table, crc, byte) do { \ + crc = ((sizeof(crc) > 1) ? SHIFT_RIGHT_SAFE(crc, 8) : 0) ^ \ + table->crc_word_[sizeof(Word) - 1][TO_BYTE(crc) ^ (byte)]; \ +} while (0) + +#define TABLE_ENTRY(table, byte, buf) \ + table[byte][Downcast(buf)] + +#define TABLE_ENTRY_LAST(table, buf) \ + table[sizeof(Word) - 1][buf] + +// Extends CRC by one word. +#define CRC_WORD(table, crc, buf) do { \ + buf ^= Downcast(crc); \ + if (sizeof(crc) > sizeof(buf)) { \ + crc = SHIFT_RIGHT_SAFE(crc, sizeof(buf) * 8); \ + crc ^= TABLE_ENTRY(table->crc_word_, 0, buf); \ + } else { \ + crc = TABLE_ENTRY(table->crc_word_, 0, buf); \ + } \ + buf >>= 8; \ + for (size_t byte = 1; byte < sizeof(buf) - 1; ++byte) { \ + crc ^= TABLE_ENTRY(table->crc_word_, byte, buf); \ + buf >>= 8; \ + } \ + crc ^= TABLE_ENTRY_LAST(table->crc_word_, buf); \ +} while (0) + +// Process beginning of data block byte by byte until source pointer +// becomes perfectly aligned on Word boundary. +#define ALIGN_ON_WORD_BOUNDARY(table, src, end, crc, Word) do { \ + while ((reinterpret_cast(src) & (sizeof(Word) - 1)) != 0) { \ + if (src >= end) { \ + return (crc ^ table->Base().Canonize()); \ + } \ + CRC_BYTE(table, crc, *src); \ + src += 1; \ + } \ +} while (0) + + +// On amd64, enforcing alignment is 2-4% slower on small (<= 64 bytes) blocks +// but 6-10% faster on larger blocks (>= 2KB). +// Break-even point (+-1%) is around 1KB (Q9650, E6600). +// +#define ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, table, src, end, crc, Word) \ +do { \ + if (sizeof(Word) > 8 || (bytes) > CRCUTIL_MIN_ALIGN_SIZE) { \ + ALIGN_ON_WORD_BOUNDARY(table, src, end, crc, Word); \ + } \ +} while (0) + +#if defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable: 4127) // conditional expression is constant +#endif // defined(_MSC_VER) + +// Forward declarations. +template class RollingCrc; + +// Crc is the type used internally and to return values of N-bit CRC. +// It should be at least as large as "TableEntry" and "Word" but +// may be larger (e.g. for 16-bit CRC, TableEntry and Word may be +// set to uint16 but Crc may be set to uint32). +// +// TableEntry is the type of values stored in the tables. +// To implement N-bit CRC, TableEntry should be large enough +// to store N bits. +// +// Word is the type used to read data sizeof(Word) at a time. +// Ideally, it shoulde be "most suitable for given architecture" +// integer type -- typically "size_t". +// +// kStride is the number of words processed in interleaved manner by +// CrcMultiword() and CrcWordblock(). Shall be either 3 or 4. +// Optimal value depends on hardware architecture (AMD64, ARM, etc). +// +template + class GenericCrc { + public: + // Make Crc, TableEntry, and Word types visible (used by RollingCrc etc.) + typedef _Crc Crc; + typedef _TableEntry TableEntry; + typedef _Word Word; + + GenericCrc() {} + + // Initializes the tables given generating polynomial of degree. + // If "canonical" is true, crc value will be XOR'ed with (-1) before and + // after actual CRC computation. + GenericCrc(const Crc &generating_polynomial, size_t degree, bool canonical) { + Init(generating_polynomial, degree, canonical); + } + void Init(const Crc &generating_polynomial, size_t degree, bool canonical) { + base_.Init(generating_polynomial, degree, canonical); + + // Instead of computing + // table[j][i] = MultiplyUnnormalized(i, 8, k), + // for all i = 0...255, we may notice that + // if i = 2**n then for all m = 1...(i-1) + // MultiplyUnnormalized(i + m, 8, k) = + // MultiplyUnnormalized(i ^ m, 8, k) = + // MultiplyUnnormalized(i, 8, k) ^ MultiplyUnnormalized(m, 8, k) = + // MultiplyUnnormalized(i, 8, k) ^ crc_word_interleaved[j][m] = + // table[i] ^ table[m]. +#if 0 + for (size_t j = 0; j < sizeof(Word); ++j) { + Crc k = Base().XpowN((sizeof(Word) * kStride - 1 - j) * 8 + degree); + for (size_t i = 0; i < 256; ++i) { + Crc temp = Base().MultiplyUnnormalized(static_cast(i), 8, k); + this->crc_word_interleaved_[j][i] = Downcast(temp); + } + } +#else + for (size_t j = 0; j < sizeof(Word); ++j) { + Crc k = Base().XpowN((sizeof(Word) * kStride - 1 - j) * 8 + degree); + TableEntry *table = this->crc_word_interleaved_[j]; + table[0] = 0; // Init 0s entry -- multiply 0 by anything yields 0. + for (size_t i = 1; i < 256; i <<= 1) { + TableEntry value = Downcast( + Base().MultiplyUnnormalized(static_cast(i), 8, k)); + table[i] = value; + for (size_t m = 1; m < i; ++m) { + table[i + m] = value ^ table[m]; + } + } + } +#endif + +#if 0 + for (size_t j = 0; j < sizeof(Word); ++j) { + Crc k = Base().XpowN((sizeof(Word) - 1 - j) * 8 + degree); + for (size_t i = 0; i < 256; ++i) { + Crc temp = Base().MultiplyUnnormalized(static_cast(i), 8, k); + this->crc_word_[j][i] = Downcast(temp); + } + } +#else + for (size_t j = 0; j < sizeof(Word); ++j) { + Crc k = Base().XpowN((sizeof(Word) - 1 - j) * 8 + degree); + TableEntry *table = this->crc_word_[j]; + table[0] = 0; // Init 0s entry -- multiply 0 by anything yields 0. + for (size_t i = 1; i < 256; i <<= 1) { + TableEntry value = Downcast( + Base().MultiplyUnnormalized(static_cast(i), 8, k)); + table[i] = value; + for (size_t m = 1; m < i; ++m) { + table[i + m] = value ^ table[m]; + } + } + } +#endif + } + + // Default CRC implementation + Crc CrcDefault(const void *data, size_t bytes, const Crc &start) const { +#if HAVE_AMD64 || HAVE_I386 + return CrcMultiword(data, bytes, start); +#else + // Very few CPUs have multiple ALUs and speculative execution + // (Itanium is an exception) so sophisticated algorithms will + // not perform better than good old Sarwate algorithm. + return CrcByteUnrolled(data, bytes, start); +#endif // HAVE_AMD64 || HAVE_I386 + } + + // Returns base class. + const GfUtil &Base() const { return base_; } + + protected: + // Canonical, byte-by-byte CRC computation. + Crc CrcByte(const void *data, size_t bytes, const Crc &start) const { + const uint8 *src = static_cast(data); + Crc crc = start ^ Base().Canonize(); + for (const uint8 *end = src + bytes; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + return (crc ^ Base().Canonize()); + } + + // Byte-by-byte CRC with main loop unrolled. + Crc CrcByteUnrolled(const void *data, size_t bytes, const Crc &start) const { + if (bytes == 0) { + return start; + } + + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + Crc crc = start ^ Base().Canonize(); + + // Unroll loop 4 times. + end -= 3; + for (; src < end; src += 4) { + PREFETCH(src); + CRC_BYTE(this, crc, src[0]); + CRC_BYTE(this, crc, src[1]); + CRC_BYTE(this, crc, src[2]); + CRC_BYTE(this, crc, src[3]); + } + end += 3; + + // Compute CRC of remaining bytes. + for (; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + + return (crc ^ Base().Canonize()); + } + + // Canonical, byte-by-byte CRC computation. + Crc CrcByteWord(const void *data, size_t bytes, const Crc &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + Crc crc0 = start ^ Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, Crc); + if (src >= end) { + return (crc0 ^ Base().Canonize()); + } + + // Process 4*sizeof(Crc) bytes at a time. + end -= 4 * sizeof(Crc) - 1; + for (; src < end; src += 4 * sizeof(Crc)) { + for (size_t i = 0; i < 4; ++i) { + crc0 ^= reinterpret_cast(src)[i]; + if (i == 0) { + PREFETCH(src); + } + for (size_t byte = 0; byte < sizeof(crc0); ++byte) { + CRC_BYTE(this, crc0, 0); + } + } + } + end += 4 * sizeof(Crc) - 1; + + // Process sizeof(Crc) bytes at a time. + end -= sizeof(Crc) - 1; + for (; src < end; src += sizeof(Crc)) { + crc0 ^= reinterpret_cast(src)[0]; + for (size_t byte = 0; byte < sizeof(crc0); ++byte) { + CRC_BYTE(this, crc0, 0); + } + } + end += sizeof(Crc) - 1; + + // Compute CRC of remaining bytes. + for (;src < end; ++src) { + CRC_BYTE(this, crc0, *src); + } + + return (crc0 ^ Base().Canonize()); + } + + // Faster, word-by-word CRC. + Crc CrcWord(const void *data, size_t bytes, const Crc &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + Crc crc0 = start ^ Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, Word); + if (src >= end) { + return (crc0 ^ Base().Canonize()); + } + + // Process 4 sizeof(Word) bytes at once. + end -= 4 * sizeof(Word) - 1; + for (; src < end; src += 4 * sizeof(Word)) { + Word buf0 = reinterpret_cast(src)[0]; + PREFETCH(src); + CRC_WORD(this, crc0, buf0); + buf0 = reinterpret_cast(src)[1]; + CRC_WORD(this, crc0, buf0); + buf0 = reinterpret_cast(src)[2]; + CRC_WORD(this, crc0, buf0); + buf0 = reinterpret_cast(src)[3]; + CRC_WORD(this, crc0, buf0); + } + end += 4 * sizeof(Word) - 1; + + // Process sizeof(Word) bytes at a time. + end -= sizeof(Word) - 1; + for (; src < end; src += sizeof(Word)) { + Word buf0 = reinterpret_cast(src)[0]; + CRC_WORD(this, crc0, buf0); + } + end += sizeof(Word) - 1; + + // Compute CRC of remaining bytes. + for (;src < end; ++src) { + CRC_BYTE(this, crc0, *src); + } + + return (crc0 ^ Base().Canonize()); + } + +#define REPEAT_FROM_1(macro) \ + macro(1); \ + macro(2); \ + macro(3); \ + macro(4); \ + macro(5); \ + macro(6); \ + macro(7); + +#define REPEAT_FROM_0(macro) \ + macro(0); \ + REPEAT_FROM_1(macro) + + // Faster, process adjusent blocks in parallel and concatenate CRCs. + Crc CrcBlockword(const void *data, size_t bytes, const Crc &start) const { + if (kStride < 2 || kStride > 8) { + // Unsupported configuration; + // fall back to something sensible. + return CrcWord(data, bytes, start); + } + + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + Crc crc0 = start ^ Base().Canonize(); + enum { + // Add 16 to avoid false L1 cache collisions. + kStripe = (15*1024 + 16) & ~(sizeof(Word) - 1), + }; + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, Word); + if (src >= end) { + return (crc0 ^ Base().Canonize()); + } + + end -= kStride * kStripe - 1; + if (src < end) { + Crc x_pow_8kStripe = Base().Xpow8N(kStripe); + do { + const uint8 *stripe_end = src + kStripe; + +#define INIT_CRC(reg) \ + Crc crc##reg; \ + if (kStride >= reg) { \ + crc##reg = 0; \ + } + REPEAT_FROM_1(INIT_CRC); +#undef INIT_CRC + + do { +#define FIRST(reg) \ + Word buf##reg; \ + if (kStride > reg) { \ + buf##reg = reinterpret_cast(src + reg * kStripe)[0]; \ + buf##reg ^= Downcast(crc##reg); \ + if (sizeof(crc##reg) > sizeof(buf##reg)) { \ + crc##reg = SHIFT_RIGHT_SAFE(crc##reg, sizeof(buf##reg) * 8); \ + crc##reg ^= TABLE_ENTRY(this->crc_word_, 0, buf##reg); \ + } else { \ + crc##reg = TABLE_ENTRY(this->crc_word_, 0, buf##reg); \ + } \ + buf##reg >>= 8; \ + } + REPEAT_FROM_0(FIRST); +#undef FIRST + + for (size_t byte = 1; byte < sizeof(buf0) - 1; ++byte) { +#define NEXT(reg) do { \ + if (kStride > reg) { \ + crc##reg ^= TABLE_ENTRY(this->crc_word_, byte, buf##reg); \ + buf##reg >>= 8; \ + } \ +} while (0) + REPEAT_FROM_0(NEXT); +#undef NEXT + } + +#define LAST(reg) do { \ + if (kStride > reg) { \ + crc##reg ^= TABLE_ENTRY_LAST(this->crc_word_, buf##reg); \ + } \ +} while (0) + REPEAT_FROM_0(LAST); +#undef LAST + + src += sizeof(Word); + } while (src < stripe_end); + +#if 0 +// The code is left for illustrational purposes only. +#define COMBINE(reg) do { \ + if (reg > 0 && kStride > reg) { \ + crc0 = Base().ChangeStartValue(crc##reg, kStripe, 0, crc0); \ + } \ +} while (0) +#else +#define COMBINE(reg) do { \ + if (reg > 0 && kStride > reg) { \ + crc0 = crc##reg ^ Base().Multiply(crc0, x_pow_8kStripe); \ + } \ +} while (0) +#endif + REPEAT_FROM_0(COMBINE); +#undef COMBINE + + src += (kStride - 1) * kStripe; + } + while (src < end); + } + end += kStride * kStripe - 1; + + // Process sizeof(Word) bytes at a time. + end -= sizeof(Word) - 1; + for (; src < end; src += sizeof(Word)) { + Word buf0 = reinterpret_cast(src)[0]; + CRC_WORD(this, crc0, buf0); + } + end += sizeof(Word) - 1; + + // Compute CRC of remaining bytes. + for (;src < end; ++src) { + CRC_BYTE(this, crc0, *src); + } + + return (crc0 ^ Base().Canonize()); + } + + // Fastest, interleaved multi-byte CRC. + Crc CrcMultiword(const void *data, size_t bytes, const Crc &start) const { + if (kStride < 2 || kStride > 8) { + // Unsupported configuration; + // fall back to something sensible. + return CrcWord(data, bytes, start); + } + + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + Crc crc0 = start ^ Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, Word); + if (src >= end) { + return (crc0 ^ Base().Canonize()); + } + + // Process kStride Word registers at once; + // should have have at least 2*kInterleaveBytes of data to start. + end -= 2*kInterleaveBytes - 1; + if (src < end) { + Crc crc_carryover; + if (sizeof(Crc) > sizeof(Word)) { + // crc_carryover is used if and only if Crc is wider than Word. + crc_carryover = 0; + } +#define INIT_CRC(reg) \ + Crc crc##reg; \ + if (reg > 0 && kStride > reg) { \ + crc##reg = 0; \ + } + REPEAT_FROM_1(INIT_CRC); +#undef INIT_CRC + +#define INIT_BUF(reg) \ + Word buf##reg; \ + if (kStride > reg) { \ + buf##reg = reinterpret_cast(src)[reg]; \ + } + REPEAT_FROM_0(INIT_BUF); +#undef INIT_BUF + + do { + PREFETCH(src); + src += kInterleaveBytes; + + if (sizeof(Crc) > sizeof(Word)) { + crc0 ^= crc_carryover; + } + +#define FIRST(reg, next_reg) do { \ + if (kStride > reg) { \ + buf##reg ^= Downcast(crc##reg); \ + if (sizeof(Crc) > sizeof(Word)) { \ + if (reg < kStride - 1) { \ + crc##next_reg ^= SHIFT_RIGHT_SAFE(crc##reg, 8 * sizeof(buf0)); \ + } else { \ + crc_carryover = SHIFT_RIGHT_SAFE(crc##reg, 8 * sizeof(buf0)); \ + } \ + } \ + crc##reg = TABLE_ENTRY(this->crc_word_interleaved_, 0, buf##reg); \ + buf##reg >>= 8; \ + } \ +} while (0) + FIRST(0, 1); + FIRST(1, 2); + FIRST(2, 3); + FIRST(3, 4); + FIRST(4, 5); + FIRST(5, 6); + FIRST(6, 7); + FIRST(7, 0); +#undef FIRST + + for (size_t byte = 1; byte < sizeof(Word) - 1; ++byte) { +#define NEXT(reg) do { \ + if (kStride > reg) { \ + crc##reg ^= \ + TABLE_ENTRY(this->crc_word_interleaved_, byte, buf##reg); \ + buf##reg >>= 8; \ + } \ +} while(0) + REPEAT_FROM_0(NEXT); +#undef NEXT + } + +#define LAST(reg) do { \ + if (kStride > reg) { \ + crc##reg ^= TABLE_ENTRY_LAST(this->crc_word_interleaved_, buf##reg); \ + buf##reg = reinterpret_cast(src)[reg]; \ + } \ +} while(0) + REPEAT_FROM_0(LAST); +#undef LAST + } + while (src < end); + + if (sizeof(Crc) > sizeof(Word)) { + crc0 ^= crc_carryover; + } + +#define COMBINE(reg) do { \ + if (kStride > reg) { \ + if (reg != 0) { \ + crc0 ^= crc##reg; \ + } \ + CRC_WORD(this, crc0, buf##reg); \ + } \ +} while (0) + REPEAT_FROM_0(COMBINE); +#undef COMBINE + + src += kInterleaveBytes; + } + end += 2*kInterleaveBytes - 1; + + // Process sizeof(Word) bytes at once. + end -= sizeof(Word) - 1; + for (; src < end; src += sizeof(Word)) { + Word buf0 = reinterpret_cast(src)[0]; + CRC_WORD(this, crc0, buf0); + } + end += sizeof(Word) - 1; + + // Compute CRC of remaining bytes. + for (;src < end; ++src) { + CRC_BYTE(this, crc0, *src); + } + + return (crc0 ^ Base().Canonize()); + } + + protected: + enum { + kInterleaveBytes = sizeof(Word) * kStride, + }; + + // Multiplication tables used by CRCs. + TableEntry crc_word_interleaved_[sizeof(Word)][256]; + TableEntry crc_word_[sizeof(Word)][256]; + + // Base class stored after CRC tables so that the most frequently + // used table is at offset 0 and may be accessed faster. + GfUtil base_; + + friend class RollingCrc< GenericCrc >; + + private: + // CrcMultiword on amd64 may run at 1.2 CPU cycles per byte which is + // noticeably faster than CrcWord (2.2-2.6 cycles/byte depending on + // hardware and compiler). However, there are problems with compilers. + // + // Test system: P45 chipset, Intel Q9650 CPU, 800MHz 4-4-4-12 memory. + // + // 64-bit compiler, <= 64-bit CRC, 64-bit tables, 64-bit reads: + // CL 15.00.307291.1 C++ >1.2< CPU cycles/byte + // ICL 11.1.051 -O3 C++ 1.5 CPU cycles/byte + // GCC 4.5 -O3 C++ 2.0 CPU cycles/byte + // GCC 4.x -O3 ASM >1.2< CPU cycles/byte + // + // 32-bit compiler, MMX used, <= 64-bit CRC, 64-bit tables, 64-bit reads + // CL 15.00.307291.1 C++ 2.0 CPU cycles/byte + // GCC 4.5 -O3 C++ 1.9 CPU cycles/byte + // ICL 11.1.051 -S C++ 1.6 CPU cycles/byte + // GCC 4.x -O3 ASM >1.3< CPU cycles/byte + // + // So, use inline ASM code for GCC for both i386 and amd64. + + Crc CrcMultiwordI386Mmx( + const void *data, size_t bytes, const Crc &start) const; + Crc CrcMultiwordGccAmd64( + const void *data, size_t bytes, const Crc &start) const; + Crc CrcMultiwordGccAmd64Sse2( + const uint8 *src, const uint8 *end, const Crc &start) const; +} GCC_ALIGN_ATTRIBUTE(16); + +#undef REPEAT_FROM_0 +#undef REPEAT_FROM_1 + + +// Specialized variants. +#if CRCUTIL_USE_ASM + +#if (defined(__GNUC__) && (HAVE_AMD64 || (HAVE_I386 && HAVE_MMX))) + +// Declare specialized functions. +template<> uint64 GenericCrc::CrcMultiword( + const void *data, size_t bytes, const uint64 &start) const; + +#if HAVE_AMD64 && HAVE_SSE2 +template<> +uint128_sse2 +GenericCrc::CrcMultiword( + const void *data, size_t bytes, const uint128_sse2 &start) const; +#endif // HAVE_AMD64 && HAVE_SSE2 + +#elif defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 150030729 && \ + (HAVE_I386 && HAVE_MMX) + +// Work around bug in MSC (present at least in v. 15.00.30729.1) +template<> uint64 GenericCrc::CrcMultiwordI386Mmx( + const void *data, + size_t bytes, + const uint64 &start) const; +template<> __forceinline +uint64 GenericCrc::CrcMultiword( + const void *data, + size_t bytes, + const uint64 &start) const { + typedef uint64 Word; + typedef uint64 Crc; + if (bytes <= 12) { + const uint8 *src = static_cast(data); + uint64 crc = start ^ Base().Canonize(); + for (const uint8 *end = src + bytes; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + return (crc ^ Base().Canonize()); + } + return CrcMultiwordI386Mmx(data, bytes, start); +} + +#endif // (defined(__GNUC__) && (HAVE_AMD64 || (HAVE_I386 && HAVE_MMX))) + +#endif // CRCUTIL_USE_ASM + + +#pragma pack(pop) + +} // namespace crcutil + +#endif // CRCUTIL_GENERIC_CRC_H_ diff --git a/crcutil-1.0/code/gf_util.h b/crcutil-1.0/code/gf_util.h new file mode 100644 index 0000000..43c1d6b --- /dev/null +++ b/crcutil-1.0/code/gf_util.h @@ -0,0 +1,304 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Defines GfUtil template class which implements +// 1. some useful operations in GF(2^n), +// 2. CRC helper function (e.g. concatenation of CRCs) which are +// not affected by specific implemenation of CRC computation per se. +// +// Please read crc.pdf to understand how it all works. + +#ifndef CRCUTIL_GF_UTIL_H_ +#define CRCUTIL_GF_UTIL_H_ + +#include "base_types.h" // uint8, uint64 +#include "crc_casts.h" // TO_BYTE() +#include "platform.h" // GCC_ALIGN_ATTRIBUTE(16), SHIFT_*_SAFE + +namespace crcutil { + +#pragma pack(push, 16) + +// "Crc" is the type used internally and to return values of N-bit CRC. +template class GfUtil { + public: + // Initializes the tables given generating polynomial of degree (degree). + // If "canonical" is true, starting CRC value and computed CRC value will be + // XOR-ed with 111...111. + GfUtil() {} + GfUtil(const Crc &generating_polynomial, size_t degree, bool canonical) { + Init(generating_polynomial, degree, canonical); + } + void Init(const Crc &generating_polynomial, size_t degree, bool canonical) { + Crc one = 1; + one <<= degree - 1; + this->generating_polynomial_ = generating_polynomial; + this->crc_bytes_ = (degree + 7) >> 3; + this->degree_ = degree; + this->one_ = one; + if (canonical) { + this->canonize_ = one | (one - 1); + } else { + this->canonize_ = 0; + } + this->normalize_[0] = 0; + this->normalize_[1] = generating_polynomial; + + Crc k = one >> 1; + for (size_t i = 0; i < sizeof(uint64) * 8; ++i) { + this->x_pow_2n_[i] = k; + k = Multiply(k, k); + } + + this->crc_of_crc_ = Multiply(this->canonize_, + this->one_ ^ Xpow8N((degree + 7) >> 3)); + + FindLCD(Xpow8N(this->crc_bytes_), &this->x_pow_minus_W_); + } + + // Returns generating polynomial. + Crc GeneratingPolynomial() const { + return this->generating_polynomial_; + } + + // Returns number of bits in CRC (degree of generating polynomial). + size_t Degree() const { + return this->degree_; + } + + // Returns start/finish adjustment constant. + Crc Canonize() const { + return this->canonize_; + } + + // Returns normalized value of 1. + Crc One() const { + return this->one_; + } + + // Returns value of CRC(A, |A|, start_new) given known + // crc=CRC(A, |A|, start_old) -- without touching the data. + Crc ChangeStartValue(const Crc &crc, uint64 bytes, + const Crc &start_old, + const Crc &start_new) const { + return (crc ^ Multiply(start_new ^ start_old, Xpow8N(bytes))); + } + + // Returns CRC of concatenation of blocks A and B when CRCs + // of blocks A and B are known -- without touching the data. + // + // To be precise, given CRC(A, |A|, startA) and CRC(B, |B|, 0), + // returns CRC(AB, |AB|, startA). + Crc Concatenate(const Crc &crc_A, const Crc &crc_B, uint64 bytes_B) const { + return ChangeStartValue(crc_B, bytes_B, 0 /* start_B */, crc_A); + } + + // Returns CRC of sequence of zeroes -- without touching the data. + Crc CrcOfZeroes(uint64 bytes, const Crc &start) const { + Crc tmp = Multiply(start ^ this->canonize_, Xpow8N(bytes)); + return (tmp ^ this->canonize_); + } + + // Given CRC of a message, stores extra (degree + 7)/8 bytes after + // the message so that CRC(message+extra, start) = result. + // Does not change CRC start value (use ChangeStartValue for that). + // Returns number of stored bytes. + size_t StoreComplementaryCrc(void *dst, + const Crc &message_crc, + const Crc &result) const { + Crc crc0 = Multiply(result ^ this->canonize_, this->x_pow_minus_W_); + crc0 ^= message_crc ^ this->canonize_; + uint8 *d = reinterpret_cast(dst); + for (size_t i = 0; i < this->crc_bytes_; ++i) { + d[i] = TO_BYTE(crc0); + crc0 >>= 8; + } + return this->crc_bytes_; + } + + // Stores given CRC of a message as (degree + 7)/8 bytes filled + // with 0s to the right. Returns number of stored bytes. + // CRC of the message and stored CRC is a constant value returned + // by CrcOfCrc() -- it does not depend on contents of the message. + size_t StoreCrc(void *dst, const Crc &crc) const { + uint8 *d = reinterpret_cast(dst); + Crc crc0 = crc; + for (size_t i = 0; i < this->crc_bytes_; ++i) { + d[i] = TO_BYTE(crc0); + crc0 >>= 8; + } + return this->crc_bytes_; + } + + // Returns expected CRC value of CRC(Message,CRC(Message)) + // when CRC is stored after the message. This value is fixed + // and does not depend on the message or CRC start value. + Crc CrcOfCrc() const { + return this->crc_of_crc_; + } + + // Returns ((a * b) mod P) where "a" and "b" are of degree <= (D-1). + Crc Multiply(const Crc &aa, const Crc &bb) const { + Crc a = aa; + Crc b = bb; + if ((a ^ (a - 1)) < (b ^ (b - 1))) { + Crc temp = a; + a = b; + b = temp; + } + + if (a == 0) { + return a; + } + + Crc product = 0; + Crc one = this->one_; + for (; a != 0; a <<= 1) { + if ((a & one) != 0) { + product ^= b; + a ^= one; + } + b = (b >> 1) ^ this->normalize_[Downcast(b & 1)]; + } + + return product; + } + + // Returns ((unnorm * m) mod P) where degree of m is <= (D-1) + // and degree of value "unnorm" is provided explicitly. + Crc MultiplyUnnormalized(const Crc &unnorm, size_t degree, + const Crc &m) const { + Crc v = unnorm; + Crc result = 0; + while (degree > this->degree_) { + degree -= this->degree_; + Crc value = v & (this->one_ | (this->one_ - 1)); + result ^= Multiply(value, Multiply(m, XpowN(degree))); + v >>= this->degree_; + } + result ^= Multiply(v << (this->degree_ - degree), m); + return result; + } + + // returns ((x ** n) mod P). + Crc XpowN(uint64 n) const { + Crc one = this->one_; + Crc result = one; + + for (size_t i = 0; n != 0; ++i, n >>= 1) { + if (n & 1) { + result = Multiply(result, this->x_pow_2n_[i]); + } + } + + return result; + } + + // Returns (x ** (8 * n) mod P). + Crc Xpow8N(uint64 n) const { + return XpowN(n << 3); + } + + // Returns remainder (A mod B) and sets *q = (A/B) of division + // of two polynomials: + // A = dividend + dividend_x_pow_D_coef * x**degree, + // B = divisor. + Crc Divide(const Crc ÷nd0, int dividend_x_pow_D_coef, + const Crc &divisor0, Crc *q) const { + Crc divisor = divisor0; + Crc dividend = dividend0; + Crc quotient = 0; + Crc coef = this->one_; + + while ((divisor & 1) == 0) { + divisor >>= 1; + coef >>= 1; + } + + if (dividend_x_pow_D_coef) { + quotient = coef >> 1; + dividend ^= divisor >> 1; + } + + Crc x_pow_degree_b = 1; + for (;;) { + if ((dividend & x_pow_degree_b) != 0) { + dividend ^= divisor; + quotient ^= coef; + } + if (coef == this->one_) { + break; + } + coef <<= 1; + x_pow_degree_b <<= 1; + divisor <<= 1; + } + + *q = quotient; + return dividend; + } + + // Extended Euclid's algorith -- for given A finds LCD(A, P) and + // value B such that (A * B) mod P = LCD(A, P). + Crc FindLCD(const Crc &A, Crc *B) const { + if (A == 0 || A == this->one_) { + *B = A; + return A; + } + + // Actually, generating polynomial is + // (generating_polynomial_ + x**degree). + int r0_x_pow_D_coef = 1; + Crc r0 = this->generating_polynomial_; + Crc b0 = 0; + Crc r1 = A; + Crc b1 = this->one_; + + for (;;) { + Crc q; + Crc r = Divide(r0, r0_x_pow_D_coef, r1, &q); + if (r == 0) { + break; + } + r0_x_pow_D_coef = 0; + + r0 = r1; + r1 = r; + + Crc b = b0 ^ Multiply(q, b1); + b0 = b1; + b1 = b; + } + + *B = b1; + return r1; + } + + protected: + Crc canonize_; + Crc x_pow_2n_[sizeof(uint64) * 8]; + Crc generating_polynomial_; + Crc one_; + Crc x_pow_minus_W_; + Crc crc_of_crc_; + Crc normalize_[2]; + size_t crc_bytes_; + size_t degree_; +} GCC_ALIGN_ATTRIBUTE(16); + +#pragma pack(pop) + +} // namespace crcutil + +#endif // CRCUTIL_GF_UTIL_H_ diff --git a/crcutil-1.0/code/multiword_128_64_gcc_amd64_sse2.cc b/crcutil-1.0/code/multiword_128_64_gcc_amd64_sse2.cc new file mode 100644 index 0000000..f94fd1f --- /dev/null +++ b/crcutil-1.0/code/multiword_128_64_gcc_amd64_sse2.cc @@ -0,0 +1,291 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements multiword CRC for GCC on i386. +// +// Small comment: the trick described in +// http://software.intel.com/en-us/articles/fast-simd-integer-move-for-the-intel-pentiumr-4-processor +// (replace "movdqa dst, src" with "pshufd $0xE4, src, dst") +// did not work: execution time increased from +// 1.8 CPU cycles/byte to 2.1 CPU cycles/byte. +// So it may be good idea on P4 but it's not on newer CPUs. +// +// movaps/xorps vs. movdqa/pxor did not make any difference. + +#include "generic_crc.h" +#include "uint128_sse2.h" + +#if defined(__GNUC__) && CRCUTIL_USE_ASM && HAVE_AMD64 && HAVE_SSE2 + +namespace crcutil { + +template<> uint128_sse2 +GenericCrc::CrcMultiwordGccAmd64Sse2( + const uint8 *src, const uint8 *end, const uint128_sse2 &start) const; + +template<> +uint128_sse2 GenericCrc::CrcMultiword( + const void *data, size_t bytes, const uint128_sse2 &start) const { + const uint8 *src = static_cast(data); + uint128_sse2 crc = start ^ this->Base().Canonize(); + const uint8 *end = src + bytes; + if (bytes <= 7) { + for (; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + return (crc ^ this->Base().Canonize()); + } + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc, uint64); + if (src >= end) { + return (crc ^ this->Base().Canonize()); + } + + return CrcMultiwordGccAmd64Sse2(src, end, crc); +} + +#define CRC_WORD_ASM() \ + SSE2_MOVQ " %[crc0], %[tmp0]\n" \ + "xorq %[tmp0], %[buf0]\n" \ + "psrldq $8, %[crc0]\n" \ + "movzbq %b[buf0], %[tmp0]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp0], %[tmp0]\n" \ + "pxor (%[table_word], %[tmp0], 8), %[crc0]\n" \ + "movzbq %b[buf0], %[tmp1]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp1], %[tmp1]\n" \ + "pxor 1*256*16(%[table_word], %[tmp1], 8), %[crc0]\n" \ + "movzbq %b[buf0], %[tmp0]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp0], %[tmp0]\n" \ + "pxor 2*256*16(%[table_word], %[tmp0], 8), %[crc0]\n" \ + "movzbq %b[buf0], %[tmp1]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp1], %[tmp1]\n" \ + "pxor 3*256*16(%[table_word], %[tmp1], 8), %[crc0]\n" \ + "movzbq %b[buf0], %[tmp0]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp0], %[tmp0]\n" \ + "pxor 4*256*16(%[table_word], %[tmp0], 8), %[crc0]\n" \ + "movzbq %b[buf0], %[tmp1]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp1], %[tmp1]\n" \ + "pxor 5*256*16(%[table_word], %[tmp1], 8), %[crc0]\n" \ + "movzbq %b[buf0], %[tmp0]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp0], %[tmp0]\n" \ + "pxor 6*256*16(%[table_word], %[tmp0], 8), %[crc0]\n" \ + "addq %[buf0], %[buf0]\n" \ + "pxor 7*256*16(%[table_word], %[buf0], 8), %[crc0]\n" + +template<> uint128_sse2 +GenericCrc::CrcMultiwordGccAmd64Sse2( + const uint8 *src, const uint8 *end, const uint128_sse2 &start) const { + __m128i crc0 = start; + __m128i crc1; + __m128i crc2; + __m128i crc3; + __m128i crc_carryover; + + uint64 buf0; + uint64 buf1; + uint64 buf2; + uint64 buf3; + + uint64 tmp0; + uint64 tmp1; + + asm( + "sub $2*4*8 - 1, %[end]\n" + "cmpq %[src], %[end]\n" + "jbe 2f\n" + + "pxor %[crc1], %[crc1]\n" + "pxor %[crc2], %[crc2]\n" + "pxor %[crc3], %[crc3]\n" + "pxor %[crc_carryover], %[crc_carryover]\n" + "movq (%[src]), %[buf0]\n" + "movq 1*8(%[src]), %[buf1]\n" + "movq 2*8(%[src]), %[buf2]\n" + "movq 3*8(%[src]), %[buf3]\n" + + "1:\n" +#if HAVE_SSE && CRCUTIL_PREFETCH_WIDTH > 0 + "prefetcht0 " TO_STRING(CRCUTIL_PREFETCH_WIDTH) "(%[src])\n" +#endif +#if GCC_VERSION_AVAILABLE(4, 5) + // Bug in GCC 4.2.4? + "add $4*8, %[src]\n" +#else + "lea 4*8(%[src]), %[src]\n" +#endif + "pxor %[crc_carryover], %[crc0]\n" + + SSE2_MOVQ " %[crc0], %[tmp0]\n" + "psrldq $8, %[crc0]\n" + "xorq %[tmp0], %[buf0]\n" + "movzbq %b[buf0], %[tmp0]\n" + "pxor %[crc0], %[crc1]\n" + "addq %[tmp0], %[tmp0]\n" + "shrq $8, %[buf0]\n" + "movdqa (%[table], %[tmp0], 8), %[crc0]\n" + + SSE2_MOVQ " %[crc1], %[tmp1]\n" + "psrldq $8, %[crc1]\n" + "xorq %[tmp1], %[buf1]\n" + "movzbq %b[buf1], %[tmp1]\n" + "pxor %[crc1], %[crc2]\n" + "addq %[tmp1], %[tmp1]\n" + "shrq $8, %[buf1]\n" + "movdqa (%[table], %[tmp1], 8), %[crc1]\n" + + SSE2_MOVQ " %[crc2], %[tmp0]\n" + "psrldq $8, %[crc2]\n" + "xorq %[tmp0], %[buf2]\n" + "movzbq %b[buf2], %[tmp0]\n" + "pxor %[crc2], %[crc3]\n" + "addq %[tmp0], %[tmp0]\n" + "shrq $8, %[buf2]\n" + "movdqa (%[table], %[tmp0], 8), %[crc2]\n" + + SSE2_MOVQ " %[crc3], %[tmp1]\n" + "psrldq $8, %[crc3]\n" + "xorq %[tmp1], %[buf3]\n" + "movzbq %b[buf3], %[tmp1]\n" + "movdqa %[crc3], %[crc_carryover]\n" + "addq %[tmp1], %[tmp1]\n" + "shrq $8, %[buf3]\n" + "movdqa (%[table], %[tmp1], 8), %[crc3]\n" + +#define XOR(byte) \ + "movzbq %b[buf0], %[tmp0]\n" \ + "shrq $8, %[buf0]\n" \ + "addq %[tmp0], %[tmp0]\n" \ + "pxor " #byte "*256*16(%[table], %[tmp0], 8), %[crc0]\n" \ + "movzbq %b[buf1], %[tmp1]\n" \ + "shrq $8, %[buf1]\n" \ + "addq %[tmp1], %[tmp1]\n" \ + "pxor " #byte "*256*16(%[table], %[tmp1], 8), %[crc1]\n" \ + "movzbq %b[buf2], %[tmp0]\n" \ + "shrq $8, %[buf2]\n" \ + "addq %[tmp0], %[tmp0]\n" \ + "pxor " #byte "*256*16(%[table], %[tmp0], 8), %[crc2]\n" \ + "movzbq %b[buf3], %[tmp1]\n" \ + "shrq $8, %[buf3]\n" \ + "addq %[tmp1], %[tmp1]\n" \ + "pxor " #byte "*256*16(%[table], %[tmp1], 8), %[crc3]\n" + + XOR(1) + XOR(2) + XOR(3) + XOR(4) + XOR(5) + XOR(6) +#undef XOR + + "addq %[buf0], %[buf0]\n" + "pxor 7*256*16(%[table], %[buf0], 8), %[crc0]\n" + "movq (%[src]), %[buf0]\n" + + "addq %[buf1], %[buf1]\n" + "pxor 7*256*16(%[table], %[buf1], 8), %[crc1]\n" + "movq 1*8(%[src]), %[buf1]\n" + + "addq %[buf2], %[buf2]\n" + "pxor 7*256*16(%[table], %[buf2], 8), %[crc2]\n" + "movq 2*8(%[src]), %[buf2]\n" + + "addq %[buf3], %[buf3]\n" + "pxor 7*256*16(%[table], %[buf3], 8), %[crc3]\n" + "movq 3*8(%[src]), %[buf3]\n" + + "cmpq %[src], %[end]\n" + "ja 1b\n" + + "pxor %[crc_carryover], %[crc0]\n" + CRC_WORD_ASM() + + "pxor %[crc1], %[crc0]\n" + "movq %[buf1], %[buf0]\n" + CRC_WORD_ASM() + + "pxor %[crc2], %[crc0]\n" + "movq %[buf2], %[buf0]\n" + CRC_WORD_ASM() + + "pxor %[crc3], %[crc0]\n" + "movq %[buf3], %[buf0]\n" + CRC_WORD_ASM() + + "add $4*8, %[src]\n" + "2:\n" + + "add $2*4*8 - 8, %[end]\n" + + "cmpq %[src], %[end]\n" + "jbe 4f\n" + "3:\n" + "movq (%[src]), %[buf0]\n" + "addq $8, %[src]\n" + CRC_WORD_ASM() + "cmpq %[src], %[end]\n" + "ja 3b\n" + + "4:\n" + "add $7, %[end]\n" + + "cmpq %[src], %[end]\n" + "jbe 6f\n" + + "5:\n" + "movzbq (%[src]), %[buf0]\n" + "add $1, %[src]\n" + SSE2_MOVQ " %[crc0], %[tmp0]\n" + "movzx %b[tmp0], %[tmp0]\n" + "psrldq $1, %[crc0]\n" + "xor %[buf0], %[tmp0]\n" + "addq %[tmp0], %[tmp0]\n" + "pxor 7*256*16(%[table_word], %[tmp0], 8), %[crc0]\n" + + "cmpq %[src], %[end]\n" + "ja 5b\n" + + "6:\n" + + : // outputs + [src] "+r" (src), + [end] "+r" (end), + [crc0] "+x" (crc0), + [crc1] "=&x" (crc1), + [crc2] "=&x" (crc2), + [crc3] "=&x" (crc3), + [crc_carryover] "=&x" (crc_carryover), + [buf0] "=&r" (buf0), + [buf1] "=&r" (buf1), + [buf2] "=&r" (buf2), + [buf3] "=&r" (buf3), + [tmp0] "=&r" (tmp0), + [tmp1] "=&r" (tmp1) + + : // inputs + [table_word] "r" (this->crc_word_), + [table] "r" (this->crc_word_interleaved_)); + + return (this->Base().Canonize() ^ crc0); +} + +} // namespace crcutil + +#endif // defined(__GNUC__) && CRCUTIL_USE_ASM && HAVE_AMD64 && HAVE_SSE2 diff --git a/crcutil-1.0/code/multiword_64_64_cl_i386_mmx.cc b/crcutil-1.0/code/multiword_64_64_cl_i386_mmx.cc new file mode 100644 index 0000000..af7352a --- /dev/null +++ b/crcutil-1.0/code/multiword_64_64_cl_i386_mmx.cc @@ -0,0 +1,304 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements 64-bit multiword CRC for Microsoft and Intel compilers +// using MMX instructions (i386). + +#include "generic_crc.h" + +#if CRCUTIL_USE_ASM && HAVE_I386 && HAVE_MMX && defined(_MSC_VER) + +namespace crcutil { + +#define CRC_WORD_MMX() \ + __asm pxor BUF0, CRC0 \ + __asm movd TMP0, BUF0 \ + __asm psrlq BUF0, 32 \ + __asm movzx TEMP, TMP0L \ + __asm shr TMP0, 8 \ + __asm movq CRC0, [TABLE + TEMP * 8] \ + __asm movzx TEMP, TMP0L \ + __asm shr TMP0, 8 \ + __asm pxor CRC0, [TABLE + TEMP * 8 + 1 * 256 * 8] \ + __asm movzx TEMP, TMP0L \ + __asm shr TMP0, 8 \ + __asm pxor CRC0, [TABLE + TEMP * 8 + 2 * 256 * 8] \ + __asm pxor CRC0, [TABLE + TMP0 * 8 + 3 * 256 * 8] \ + __asm movd TMP0, BUF0 \ + __asm movzx TEMP, TMP0L \ + __asm shr TMP0, 8 \ + __asm pxor CRC0, [TABLE + TEMP * 8 + 4 * 256 * 8] \ + __asm movzx TEMP, TMP0L \ + __asm shr TMP0, 8 \ + __asm pxor CRC0, [TABLE + TEMP * 8 + 5 * 256 * 8] \ + __asm movzx TEMP, TMP0L \ + __asm shr TMP0, 8 \ + __asm pxor CRC0, [TABLE + TEMP * 8 + 6 * 256 * 8] \ + __asm pxor CRC0, [TABLE + TMP0 * 8 + 7 * 256 * 8] + +// frame pointer register 'ebp' modified by inline assembly code +#pragma warning(disable: 4731) + +template<> uint64 GenericCrc::CrcMultiwordI386Mmx( + const void *data, + size_t bytes, + const uint64 &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + uint64 crc0 = start ^ this->Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, uint64); + if (src >= end) { + return (crc0 ^ this->Base().Canonize()); + } + +#define CRC0 mm0 +#define CRC1 mm1 +#define CRC2 mm2 +#define CRC3 mm3 +#define BUF0 mm4 +#define BUF1 mm5 +#define BUF2 mm6 +#define BUF3 mm7 +#define TMP0 eax +#define TMP0L al +#define TMP0H ah +#define TMP1 ebx +#define TMP1L bl +#define TMP1H bh +#define TMP2 ecx +#define TMP2L cl +#define TMP2H ch +#define TMP3 edx +#define TMP3L dl +#define TMP3H dh +#define TEMP edi +#define SRC esi +#define END [esp] +#define TABLE ebp + + + const uint64 *interleaved_table_address = + &this->crc_word_interleaved_[0][0]; + const uint64 *word_table_address = &this->crc_word_[0][0]; + + __asm { + push ebp + + mov TMP0, interleaved_table_address + + movq CRC0, crc0 + mov SRC, src + mov TMP1, end + sub TMP1, 2*4*8 - 1 + cmp SRC, TMP1 + mov TABLE, word_table_address + jae end_main_loop + + push TABLE + mov TABLE, TMP0 + push TMP1 + + pxor CRC1, CRC1 + pxor CRC2, CRC2 + pxor CRC3, CRC3 + + movq BUF0, [SRC] + movq BUF1, [SRC + 1 * 8] + movq BUF2, [SRC + 2 * 8] + movq BUF3, [SRC + 3 * 8] + + main_loop: +#if HAVE_SSE && CRCUTIL_PREFETCH_WIDTH > 0 + prefetcht0 [SRC + CRCUTIL_PREFETCH_WIDTH] +#endif + add SRC, 32 + pxor BUF0, CRC0 + pxor BUF1, CRC1 + pxor BUF2, CRC2 + pxor BUF3, CRC3 + + movd TMP0, BUF0 + psrlq BUF0, 32 + movd TMP1, BUF1 + psrlq BUF1, 32 + movd TMP2, BUF2 + psrlq BUF2, 32 + movd TMP3, BUF3 + psrlq BUF3, 32 + + movzx TEMP, TMP0L + movq CRC0, [TABLE + TEMP * 8] + movzx TEMP, TMP1L + movq CRC1, [TABLE + TEMP * 8] + movzx TEMP, TMP2L + movq CRC2, [TABLE + TEMP * 8] + movzx TEMP, TMP3L + movq CRC3, [TABLE + TEMP * 8] + + movzx TEMP, TMP0H + shr TMP0, 16 + pxor CRC0, [TABLE + TEMP * 8 + 1 * 256 * 8] + movzx TEMP, TMP1H + shr TMP1, 16 + pxor CRC1, [TABLE + TEMP * 8 + 1 * 256 * 8] + movzx TEMP, TMP2H + shr TMP2, 16 + pxor CRC2, [TABLE + TEMP * 8 + 1 * 256 * 8] + movzx TEMP, TMP3H + shr TMP3, 16 + pxor CRC3, [TABLE + TEMP * 8 + 1 * 256 * 8] + + movzx TEMP, TMP0L + shr TMP0, 8 + pxor CRC0, [TABLE + TEMP * 8 + 2 * 256 * 8] + movzx TEMP, TMP1L + shr TMP1, 8 + pxor CRC1, [TABLE + TEMP * 8 + 2 * 256 * 8] + movzx TEMP, TMP2L + shr TMP2, 8 + pxor CRC2, [TABLE + TEMP * 8 + 2 * 256 * 8] + movzx TEMP, TMP3L + shr TMP3, 8 + pxor CRC3, [TABLE + TEMP * 8 + 2 * 256 * 8] + + pxor CRC0, [TABLE + TMP0 * 8 + 3 * 256 * 8] + movd TMP0, BUF0 + pxor CRC1, [TABLE + TMP1 * 8 + 3 * 256 * 8] + movd TMP1, BUF1 + pxor CRC2, [TABLE + TMP2 * 8 + 3 * 256 * 8] + movd TMP2, BUF2 + pxor CRC3, [TABLE + TMP3 * 8 + 3 * 256 * 8] + movd TMP3, BUF3 + + movzx TEMP, TMP0L + pxor CRC0, [TABLE + TEMP * 8 + 4 * 256 * 8] + movzx TEMP, TMP1L + pxor CRC1, [TABLE + TEMP * 8 + 4 * 256 * 8] + movzx TEMP, TMP2L + pxor CRC2, [TABLE + TEMP * 8 + 4 * 256 * 8] + movzx TEMP, TMP3L + pxor CRC3, [TABLE + TEMP * 8 + 4 * 256 * 8] + + movzx TEMP, TMP0H + shr TMP0, 16 + pxor CRC0, [TABLE + TEMP * 8 + 5 * 256 * 8] + movzx TEMP, TMP1H + shr TMP1, 16 + pxor CRC1, [TABLE + TEMP * 8 + 5 * 256 * 8] + movzx TEMP, TMP2H + shr TMP2, 16 + pxor CRC2, [TABLE + TEMP * 8 + 5 * 256 * 8] + movzx TEMP, TMP3H + shr TMP3, 16 + pxor CRC3, [TABLE + TEMP * 8 + 5 * 256 * 8] + + movzx TEMP, TMP0L + shr TMP0, 8 + pxor CRC0, [TABLE + TEMP * 8 + 6 * 256 * 8] + movzx TEMP, TMP1L + shr TMP1, 8 + pxor CRC1, [TABLE + TEMP * 8 + 6 * 256 * 8] + movzx TEMP, TMP2L + shr TMP2, 8 + pxor CRC2, [TABLE + TEMP * 8 + 6 * 256 * 8] + movzx TEMP, TMP3L + shr TMP3, 8 + pxor CRC3, [TABLE + TEMP * 8 + 6 * 256 * 8] + + pxor CRC0, [TABLE + TMP0 * 8 + 7 * 256 * 8] + movq BUF0, [SRC] + pxor CRC1, [TABLE + TMP1 * 8 + 7 * 256 * 8] + movq BUF1, [SRC + 1 * 8] + pxor CRC2, [TABLE + TMP2 * 8 + 7 * 256 * 8] + movq BUF2, [SRC + 2 * 8] + pxor CRC3, [TABLE + TMP3 * 8 + 7 * 256 * 8] + movq BUF3, [SRC + 3 * 8] + + cmp END, SRC + ja main_loop + +#undef END +#define END TMP1 + pop END + pop TABLE + add SRC, 32 + + CRC_WORD_MMX() + + pxor BUF1, CRC1 + movq BUF0, BUF1 + CRC_WORD_MMX() + + pxor BUF2, CRC2 + movq BUF0, BUF2 + CRC_WORD_MMX() + + pxor BUF3, CRC3 + movq BUF0, BUF3 + CRC_WORD_MMX() + + end_main_loop: + add END, 2*4*8 - 8 + cmp SRC, END + jae end_word_loop + + word_loop: + movq BUF0, [SRC] + add SRC, 8 + CRC_WORD_MMX() + cmp END, SRC + ja word_loop + end_word_loop: + +#if 0 // Plain C version is faster? + add END, 7 + cmp SRC, END + jae end_byte_loop + + byte_loop: + movd TMP0, CRC0 + movzx TEMP, byte ptr [SRC] + movzx TMP0, TMP0L + psrlq CRC0, 8 + xor TEMP, TMP0 + add SRC, 1 + pxor CRC0, [TABLE + TEMP*8 + 7*256*8] + cmp END, SRC + ja byte_loop + end_byte_loop: +#endif + + pop ebp + + mov src, SRC + movq crc0, CRC0 + + emms + } + +#if 1 + // Compute CRC of remaining bytes. + for (;src < end; ++src) { + CRC_BYTE(this, crc0, *src); + } +#endif + + return (crc0 ^ this->Base().Canonize()); +} + + +} // namespace crcutil + +#endif // CRCUTIL_USE_ASM && HAVE_I386 && HAVE_MMX && defined(_MSC_VER) diff --git a/crcutil-1.0/code/multiword_64_64_gcc_amd64_asm.cc b/crcutil-1.0/code/multiword_64_64_gcc_amd64_asm.cc new file mode 100644 index 0000000..36630fd --- /dev/null +++ b/crcutil-1.0/code/multiword_64_64_gcc_amd64_asm.cc @@ -0,0 +1,298 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements multiword CRC for GCC on AMD64. +// +// Accoding to "Software Optimization Guide for AMD Family 10h Processors" +// http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/40546.pdf +// instead of +// movzbq %al, %rsi +// shrq $8, %rax +// [use %rsi] +// movzbq %al, %rsi +// shrq $8, %rax +// [use %rsi] +// it is better to use 32-bit registers +// (high 32 bits will be cleared on assignment), i.e. +// movzbl %al, %esi +// [use %rsi] +// movzbl %ah, %esi +// shrq $16, %rax +// [use %rsi] +// Makes instructions shorter and removes one shift +// (the latter is not such a big deal as it's execution time +// is nicely masked by [use %rsi] instruction). +// +// Performance difference: +// About 10% degradation on bytes = 8 .. 16 +// (clobbering registers that should be saved) +// Break even at 32 bytes. +// 3% improvement starting from 64 bytes. + +#include "generic_crc.h" + +#if defined(__GNUC__) && CRCUTIL_USE_ASM && HAVE_AMD64 + +namespace crcutil { + +template<> uint64 GenericCrc::CrcMultiwordGccAmd64( + const void *data, size_t bytes, const uint64 &start) const; + +template<> uint64 GenericCrc::CrcMultiword( + const void *data, + size_t bytes, + const uint64 &start) const { + if (bytes <= 6 * sizeof(Word) - 1) { + const uint8 *src = static_cast(data); + uint64 crc = start ^ this->Base().Canonize(); + const uint8 *end = src + bytes; +#define PROCESS_ONE_WORD() do { \ + Word buf = reinterpret_cast(src)[0]; \ + CRC_WORD(this, crc, buf); \ + src += sizeof(Word); \ +} while (0) + if (bytes >= 1 * sizeof(Word)) { + PROCESS_ONE_WORD(); + if (bytes >= 2 * sizeof(Word)) { + PROCESS_ONE_WORD(); + if (bytes >= 3 * sizeof(Word)) { + PROCESS_ONE_WORD(); + if (bytes >= 4 * sizeof(Word)) { + PROCESS_ONE_WORD(); + if (bytes >= 5 * sizeof(Word)) { + PROCESS_ONE_WORD(); + } + } + } + } + } + for (; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + return (crc ^ this->Base().Canonize()); + } + return this->CrcMultiwordGccAmd64(data, bytes, start); +} + +#define TMP0 "%%rsi" +#define TMP0W "%%esi" + +#define BUF0 "%%rax" +#define BUF0L "%%al" +#define BUF0H "%%ah" + +#define BUF1 "%%rbx" +#define BUF1L "%%bl" +#define BUF1H "%%bh" + +#define BUF2 "%%rcx" +#define BUF2L "%%cl" +#define BUF2H "%%ch" + +#define BUF3 "%%rdx" +#define BUF3L "%%dl" +#define BUF3H "%%dh" + +#define CRC_WORD_ASM() \ + "xorq %[crc0], " BUF0 "\n" \ + "movzbq " BUF0L ", " TMP0 "\n" \ + "movq (%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbl " BUF0H ", " TMP0W "\n" \ + "shrq $16, " BUF0 "\n" \ + "xorq 1*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbq " BUF0L ", " TMP0 "\n" \ + "xorq 2*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbl " BUF0H ", " TMP0W "\n" \ + "shrq $16, " BUF0 "\n" \ + "xorq 3*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbq " BUF0L ", " TMP0 "\n" \ + "xorq 4*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbl " BUF0H ", " TMP0W "\n" \ + "shrq $16, " BUF0 "\n" \ + "xorq 5*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbq " BUF0L ", " TMP0 "\n" \ + "xorq 6*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" \ + "movzbl " BUF0H ", " TMP0W "\n" \ + "xorq 7*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" + +template<> uint64 GenericCrc::CrcMultiwordGccAmd64( + const void *data, size_t bytes, const uint64 &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + uint64 crc0 = start ^ this->Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, uint64); + if (src >= end) { + return (crc0 ^ this->Base().Canonize()); + } + + uint64 crc1; + uint64 crc2; + uint64 crc3; + + asm( + "sub $2*4*8 - 1, %[end]\n" + "cmpq %[src], %[end]\n" + "jbe 2f\n" + "xorq %[crc1], %[crc1]\n" + "movq (%[src]), " BUF0 "\n" + "movq 1*8(%[src]), " BUF1 "\n" + "movq 2*8(%[src]), " BUF2 "\n" + "movq 3*8(%[src]), " BUF3 "\n" + "movq %[crc1], %[crc2]\n" + "movq %[crc1], %[crc3]\n" + + "1:\n" +#if HAVE_SSE && CRCUTIL_PREFETCH_WIDTH > 0 + "prefetcht0 " TO_STRING(CRCUTIL_PREFETCH_WIDTH) "(%[src])\n" +#endif // HAVE_SSE + "add $4*8, %[src]\n" + + // Set buffer data. + "xorq %[crc0], " BUF0 "\n" + "xorq %[crc1], " BUF1 "\n" + "xorq %[crc2], " BUF2 "\n" + "xorq %[crc3], " BUF3 "\n" + + // LOAD crc of byte 0 and shift buffers. + "movzbl " BUF0L ", " TMP0W "\n" + "movq (%[table], " TMP0 ", 8), %[crc0]\n" + "movzbl " BUF1L ", " TMP0W "\n" + "movq (%[table], " TMP0 ", 8), %[crc1]\n" + "movzbl " BUF2L ", " TMP0W "\n" + "movq (%[table], " TMP0 ", 8), %[crc2]\n" + "movzbl " BUF3L ", " TMP0W "\n" + "movq (%[table], " TMP0 ", 8), %[crc3]\n" + +#define XOR1(byte1) \ + "movzbl " BUF0L ", " TMP0W "\n" \ + "xorq " #byte1 "*256*8(%[table], " TMP0 ", 8), %[crc0]\n" \ + "movzbl " BUF1L ", " TMP0W "\n" \ + "xorq " #byte1 "*256*8(%[table], " TMP0 ", 8), %[crc1]\n" \ + "movzbl " BUF2L ", " TMP0W "\n" \ + "xorq " #byte1 "*256*8(%[table], " TMP0 ", 8), %[crc2]\n" \ + "movzbl " BUF3L ", " TMP0W "\n" \ + "xorq " #byte1 "*256*8(%[table], " TMP0 ", 8), %[crc3]\n" + +#define XOR2(byte2) \ + "movzbl " BUF0H ", " TMP0W "\n" \ + "shrq $16, " BUF0 "\n" \ + "xorq " #byte2 "*256*8(%[table], " TMP0 ", 8), %[crc0]\n" \ + "movzbl " BUF1H ", " TMP0W "\n" \ + "shrq $16, " BUF1 "\n" \ + "xorq " #byte2 "*256*8(%[table], " TMP0 ", 8), %[crc1]\n" \ + "movzbl " BUF2H ", " TMP0W "\n" \ + "shrq $16, " BUF2 "\n" \ + "xorq " #byte2 "*256*8(%[table], " TMP0 ", 8), %[crc2]\n" \ + "movzbl " BUF3H ", " TMP0W "\n" \ + "shrq $16, " BUF3 "\n" \ + "xorq " #byte2 "*256*8(%[table], " TMP0 ", 8), %[crc3]\n" + + XOR2(1) + XOR1(2) + XOR2(3) + XOR1(4) + XOR2(5) + XOR1(6) + + // Update CRC registers and load buffers. + "movzbl " BUF0H ", " TMP0W "\n" + "xorq 7*256*8(%[table], " TMP0 ", 8), %[crc0]\n" + "movq (%[src]), " BUF0 "\n" + "movzbl " BUF1H ", " TMP0W "\n" + "xorq 7*256*8(%[table], " TMP0 ", 8), %[crc1]\n" + "movq 1*8(%[src]), " BUF1 "\n" + "movzbl " BUF2H ", " TMP0W "\n" + "xorq 7*256*8(%[table], " TMP0 ", 8), %[crc2]\n" + "movq 2*8(%[src]), " BUF2 "\n" + "movzbl " BUF3H ", " TMP0W "\n" + "xorq 7*256*8(%[table], " TMP0 ", 8), %[crc3]\n" + "movq 3*8(%[src]), " BUF3 "\n" + + "cmpq %[src], %[end]\n" + "ja 1b\n" + + CRC_WORD_ASM() + + "xorq %[crc1], " BUF1 "\n" + "movq " BUF1 ", " BUF0 "\n" + CRC_WORD_ASM() + + "xorq %[crc2], " BUF2 "\n" + "movq " BUF2 ", " BUF0 "\n" + CRC_WORD_ASM() + + "xorq %[crc3], " BUF3 "\n" + "movq " BUF3 ", " BUF0 "\n" + CRC_WORD_ASM() + + "add $4*8, %[src]\n" + + "2:\n" + "add $2*4*8 - 8, %[end]\n" + "cmpq %[src], %[end]\n" + "jbe 4f\n" + + "3:\n" + "movq (%[src]), " BUF0 "\n" + "add $8, %[src]\n" + CRC_WORD_ASM() + "cmpq %[src], %[end]\n" + "ja 3b\n" + + "4:\n" + "add $7, %[end]\n" + + "cmpq %[src], %[end]\n" + "jbe 6f\n" + + "5:\n" + "movzbq (%[src]), " BUF0 "\n" + "movzbq %b[crc0], " TMP0 "\n" + "shrq $8, %[crc0]\n" + "xorq " BUF0 ", " TMP0 "\n" + "add $1, %[src]\n" + "xorq 7*256*8(%[table_word], " TMP0 ", 8), %[crc0]\n" + "cmpq %[src], %[end]\n" + "ja 5b\n" + + "6:\n" + + + : // outputs + [src] "+r" (src), + [end] "+r" (end), + [crc0] "+r" (crc0), + [crc1] "=&r" (crc1), + [crc2] "=&r" (crc2), + [crc3] "=&r" (crc3) + + : // inputs + [table] "r" (&this->crc_word_interleaved_[0][0]), + [table_word] "r" (&this->crc_word_[0][0]) + + : // clobbers + "%rax", // BUF0 + "%rbx", // BUF1 + "%rcx", // BUF2 + "%rdx", // BUF3 + "%rsi" // TMP0 + ); + + return (crc0 ^ this->Base().Canonize()); +} + +} // namespace crcutil + +#endif // defined(__GNUC__) && HAVE_AMD64 && CRCUTIL_USE_ASM diff --git a/crcutil-1.0/code/multiword_64_64_gcc_i386_mmx.cc b/crcutil-1.0/code/multiword_64_64_gcc_i386_mmx.cc new file mode 100644 index 0000000..09542f9 --- /dev/null +++ b/crcutil-1.0/code/multiword_64_64_gcc_i386_mmx.cc @@ -0,0 +1,261 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements multiword CRC for GCC on i386. + +#include "generic_crc.h" + +#if defined(__GNUC__) && CRCUTIL_USE_ASM && HAVE_I386 && HAVE_MMX + +namespace crcutil { + +template<> uint64 GenericCrc::CrcMultiwordI386Mmx( + const void *data, size_t bytes, const uint64 &start) + const GCC_OMIT_FRAME_POINTER; + +template<> uint64 GenericCrc::CrcMultiword( + const void *data, size_t bytes, const uint64 &start) const { + if (bytes <= 7) { + const uint8 *src = static_cast(data); + uint64 crc = start ^ this->Base().Canonize(); + for (const uint8 *end = src + bytes; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + return (crc ^ this->Base().Canonize()); + } + return CrcMultiwordI386Mmx(data, bytes, start); +} + +#define CRC_WORD_MMX() \ + "pxor %[crc0], %[buf0]\n" \ + "movd %[buf0], %[tmp0]\n" \ + "psrlq $32, %[buf0]\n" \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "movq (%[table], %[temp], 8), %[crc0]\n" \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "pxor 1*256*8(%[table], %[temp], 8), %[crc0]\n" \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "pxor 2*256*8(%[table], %[temp], 8), %[crc0]\n" \ + "pxor 3*256*8(%[table], %[tmp0], 8), %[crc0]\n" \ + "movd %[buf0], %[tmp0]\n" \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "pxor 4*256*8(%[table], %[temp], 8), %[crc0]\n" \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "pxor 5*256*8(%[table], %[temp], 8), %[crc0]\n" \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "pxor 6*256*8(%[table], %[temp], 8), %[crc0]\n" \ + "pxor 7*256*8(%[table], %[tmp0], 8), %[crc0]\n" + +template<> uint64 GenericCrc::CrcMultiwordI386Mmx( + const void *data, size_t bytes, const uint64 &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + uint64 crc0 = start ^ this->Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc0, uint64); + if (src >= end) { + return (crc0 ^ this->Base().Canonize()); + } + + uint64 crc1; + uint64 crc2; + uint64 crc3; + + uint64 buf0; + uint64 buf1; + uint64 buf2; + uint64 buf3; + + uint32 tmp0; + uint32 tmp1; + uint32 tmp2; + uint32 tmp3; + + uint32 temp; + + void *table_ptr; + const uint64 *table_interleaved = &this->crc_word_interleaved_[0][0]; + const uint64 *table_word = &this->crc_word_[0][0]; + + asm( + "sub $2*4*8 - 1, %[end]\n" + "cmpl %[src], %[end]\n" + "jbe 2f\n" + + "pxor %[crc1], %[crc1]\n" + "pxor %[crc2], %[crc2]\n" + "pxor %[crc3], %[crc3]\n" + "movq (%[src]), %[buf0]\n" + "movq 1*8(%[src]), %[buf1]\n" + "movq 2*8(%[src]), %[buf2]\n" + "movq 3*8(%[src]), %[buf3]\n" + + "movl %[table_interleaved], %[table]\n" + "1:\n" +#if HAVE_SSE && CRCUTIL_PREFETCH_WIDTH > 0 + "prefetcht0 " TO_STRING(CRCUTIL_PREFETCH_WIDTH) "(%[src])\n" +#endif + "addl $0x20, %[src]\n" + "pxor %[crc0], %[buf0]\n" + "pxor %[crc1], %[buf1]\n" + "pxor %[crc2], %[buf2]\n" + "pxor %[crc3], %[buf3]\n" + + "movd %[buf0], %[tmp0]\n" + "psrlq $32, %[buf0]\n" + "movd %[buf1], %[tmp1]\n" + "psrlq $32, %[buf1]\n" + "movd %[buf2], %[tmp2]\n" + "psrlq $32, %[buf2]\n" + "movd %[buf3], %[tmp3]\n" + "psrlq $32, %[buf3]\n" + + "movzbl %b[tmp0], %[temp]\n" + "shrl $8, %[tmp0]\n" + "movq (%[table], %[temp], 8), %[crc0]\n" + "movzbl %b[tmp1], %[temp]\n" + "shrl $8, %[tmp1]\n" + "movq (%[table], %[temp], 8), %[crc1]\n" + "movzbl %b[tmp2], %[temp]\n" + "shrl $8, %[tmp2]\n" + "movq (%[table], %[temp], 8), %[crc2]\n" + "movzbl %b[tmp3], %[temp]\n" + "shrl $8, %[tmp3]\n" + "movq (%[table], %[temp], 8), %[crc3]\n" + +#define XOR(byte) \ + "movzbl %b[tmp0], %[temp]\n" \ + "shrl $8, %[tmp0]\n" \ + "pxor " #byte "*256*8(%[table], %[temp], 8), %[crc0]\n" \ + "movzbl %b[tmp1], %[temp]\n" \ + "shrl $8, %[tmp1]\n" \ + "pxor " #byte "*256*8(%[table], %[temp], 8), %[crc1]\n" \ + "movzbl %b[tmp2], %[temp]\n" \ + "shrl $8, %[tmp2]\n" \ + "pxor " #byte "*256*8(%[table], %[temp], 8), %[crc2]\n" \ + "movzbl %b[tmp3], %[temp]\n" \ + "shrl $8, %[tmp3]\n" \ + "pxor " #byte "*256*8(%[table], %[temp], 8), %[crc3]\n" + + XOR(1) + XOR(2) + + "pxor 3*256*8(%[table], %[tmp0], 8), %[crc0]\n" + "movd %[buf0], %[tmp0]\n" + "pxor 3*256*8(%[table], %[tmp1], 8), %[crc1]\n" + "movd %[buf1], %[tmp1]\n" + "pxor 3*256*8(%[table], %[tmp2], 8), %[crc2]\n" + "movd %[buf2], %[tmp2]\n" + "pxor 3*256*8(%[table], %[tmp3], 8), %[crc3]\n" + "movd %[buf3], %[tmp3]\n" + + XOR(4) + XOR(5) + XOR(6) + + "pxor 7*256*8(%[table], %[tmp0], 8), %[crc0]\n" + "movq (%[src]), %[buf0]\n" + "pxor 7*256*8(%[table], %[tmp1], 8), %[crc1]\n" + "movq 1*8(%[src]), %[buf1]\n" + "pxor 7*256*8(%[table], %[tmp2], 8), %[crc2]\n" + "movq 2*8(%[src]), %[buf2]\n" + "pxor 7*256*8(%[table], %[tmp3], 8), %[crc3]\n" + "movq 3*8(%[src]), %[buf3]\n" + "cmpl %[src], %[end]\n" + "ja 1b\n" +#undef XOR + + "movl %[table_word], %[table]\n" + CRC_WORD_MMX() + + "pxor %[crc1], %[buf1]\n" + "movq %[buf1], %[buf0]\n" + CRC_WORD_MMX() + + "pxor %[crc2], %[buf2]\n" + "movq %[buf2], %[buf0]\n" + CRC_WORD_MMX() + + "pxor %[crc3], %[buf3]\n" + "movq %[buf3], %[buf0]\n" + CRC_WORD_MMX() + + "add $4*8, %[src]\n" + "2:\n" + "movl %[table_word], %[table]\n" + + "add $2*4*8 - 8, %[end]\n" + "cmpl %[src], %[end]\n" + "jbe 4f\n" + "3:\n" + "movq (%[src]), %[buf0]\n" + "addl $0x8, %[src]\n" + CRC_WORD_MMX() + "cmpl %[src], %[end]\n" + "ja 3b\n" + "4:\n" + "add $7, %[end]\n" + + "cmpl %[src], %[end]\n" + "jbe 6f\n" + + "5:\n" + "movd %[crc0], %[tmp0]\n" + "movzbl (%[src]), %[temp]\n" + "movzbl %b[tmp0], %[tmp0]\n" + "psrlq $8, %[crc0]\n" + "xorl %[tmp0], %[temp]\n" + "add $1, %[src]\n" + "pxor 7*256*8(%[table], %[temp], 8), %[crc0]\n" + "cmpl %[src], %[end]\n" + "ja 5b\n" + + "6:\n" + + : // outputs + [src] "+r" (src), + [end] "+m" (end), + [crc0] "+y" (crc0), + [crc1] "=&y" (crc1), + [crc2] "=&y" (crc2), + [crc3] "=&y" (crc3), + [buf0] "=&y" (buf0), + [buf1] "=&y" (buf1), + [buf2] "=&y" (buf2), + [buf3] "=&y" (buf3), + [tmp0] "=&q" (tmp0), + [tmp1] "=&q" (tmp1), + [tmp2] "=&q" (tmp2), + [tmp3] "=&q" (tmp3), + [temp] "=&r" (temp), + [table] "=&r" (table_ptr) + + : // inputs + [table_interleaved] "m" (table_interleaved), + [table_word] "m" (table_word)); + + asm volatile("emms"); + + return (crc0 ^ this->Base().Canonize()); +} + +} // namespace crcutil + +#endif // defined(__GNUC__) && HAVE_AMD64 && CRCUTIL_USE_ASM diff --git a/crcutil-1.0/code/multiword_64_64_intrinsic_i386_mmx.cc b/crcutil-1.0/code/multiword_64_64_intrinsic_i386_mmx.cc new file mode 100644 index 0000000..302af5a --- /dev/null +++ b/crcutil-1.0/code/multiword_64_64_intrinsic_i386_mmx.cc @@ -0,0 +1,243 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements 64-bit multiword CRC using MMX built-in functions. + +#include "generic_crc.h" + +#if CRCUTIL_USE_ASM && HAVE_I386 && HAVE_MMX + +namespace crcutil { + +template<> uint64 GenericCrc::CrcMultiwordI386Mmx( + const void *data, size_t bytes, const uint64 &start) + const GCC_OMIT_FRAME_POINTER; + +#if !defined(_MSC_VER) +template<> uint64 GenericCrc::CrcMultiword( + const void *data, + size_t bytes, + const uint64 &start) const { + if (bytes <= 7) { + const uint8 *src = static_cast(data); + uint64 crc = start ^ Base().Canonize(); + for (const uint8 *end = src + bytes; src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + return (crc ^ Base().Canonize()); + } + return CrcMultiwordI386Mmx(data, bytes, start); +} +#else +#pragma warning(push) +// CL: uninitialized local variable 'crc1' used +// Wrong: crc1 = XOR(crc1, crc1) sets it to 0. +#pragma warning(disable: 4700) + +#pragma warning(disable: 4619) // there is no warning number '592' + +// ICL: variable "crc1" is used before its value is set +// Wrong: crc1 = XOR(crc1, crc1) sets it to 0. +#pragma warning(disable: 592) +#endif // !defined(_MSC_VER) + +#define MM64(adr) reinterpret_cast(adr) +#define MM64_TABLE(byte) MM64(crc_word_interleaved_[byte]) + +#define CRC_WORD_MMX(this, crc, buf) do { \ + buf = _mm_xor_si64(buf, crc); \ + uint32 tmp = static_cast(_mm_cvtsi64_si32(buf)); \ + buf = _mm_srli_si64(buf, 32); \ + crc = MM64(crc_word_[0])[TO_BYTE(tmp)]; \ + tmp >>= 8; \ + crc = _mm_xor_si64(crc, MM64(crc_word_[1])[TO_BYTE(tmp)]); \ + tmp >>= 8; \ + crc = _mm_xor_si64(crc, MM64(crc_word_[2])[TO_BYTE(tmp)]); \ + tmp >>= 8; \ + crc = _mm_xor_si64(crc, MM64(crc_word_[3])[tmp]); \ + tmp = static_cast(_mm_cvtsi64_si32(buf)); \ + crc = _mm_xor_si64(crc, MM64(crc_word_[4])[TO_BYTE(tmp)]); \ + tmp >>= 8; \ + crc = _mm_xor_si64(crc, MM64(crc_word_[5])[TO_BYTE(tmp)]); \ + tmp >>= 8; \ + crc = _mm_xor_si64(crc, MM64(crc_word_[6])[TO_BYTE(tmp)]); \ + tmp >>= 8; \ + crc = _mm_xor_si64(crc, MM64(crc_word_[7])[tmp]); \ +} while (0) + +template<> uint64 GenericCrc::CrcMultiwordI386Mmx( + const void *data, size_t bytes, const uint64 &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + uint64 crc = start ^ Base().Canonize(); + + ALIGN_ON_WORD_BOUNDARY_IF_NEEDED(bytes, this, src, end, crc, uint64); + if (src >= end) { + return (crc ^ Base().Canonize()); + } + + // Process 4 registers of sizeof(uint64) bytes at once. + bytes = static_cast(end - src) & ~(4*8 - 1); + if (bytes > 4*8) { + const uint8 *stop = src + bytes - 4*8; + union { + __m64 m64; + uint64 u64; + } temp; + __m64 crc0; + __m64 crc1; + __m64 crc2; + __m64 crc3; + __m64 buf0 = MM64(src)[0]; + __m64 buf1 = MM64(src)[1]; + __m64 buf2 = MM64(src)[2]; + __m64 buf3 = MM64(src)[3]; + + temp.u64 = crc; + crc0 = temp.m64; +#if defined(__GNUC__) && !GCC_VERSION_AVAILABLE(4, 4) + // There is no way to suppress a warning in GCC; + // generate extra assignments. + temp.u64 = 0; + crc1 = temp.m64; + crc2 = temp.m64; + crc3 = temp.m64; +#else + crc1 = _mm_xor_si64(crc1, crc1); + crc2 = _mm_xor_si64(crc2, crc2); + crc3 = _mm_xor_si64(crc3, crc3); +#endif // defined(__GNUC__) && !GCC_VERSION_AVAILABLE(4, 4) + + do { + PREFETCH(src); + src += 4*8; + + buf0 = _mm_xor_si64(buf0, crc0); + buf1 = _mm_xor_si64(buf1, crc1); + buf2 = _mm_xor_si64(buf2, crc2); + buf3 = _mm_xor_si64(buf3, crc3); + + uint32 tmp0 = static_cast(_mm_cvtsi64_si32(buf0)); + uint32 tmp1 = static_cast(_mm_cvtsi64_si32(buf1)); + uint32 tmp2 = static_cast(_mm_cvtsi64_si32(buf2)); + uint32 tmp3 = static_cast(_mm_cvtsi64_si32(buf3)); + + buf0 = _mm_srli_si64(buf0, 32); + buf1 = _mm_srli_si64(buf1, 32); + buf2 = _mm_srli_si64(buf2, 32); + buf3 = _mm_srli_si64(buf3, 32); + + crc0 = MM64_TABLE(0)[TO_BYTE(tmp0)]; + tmp0 >>= 8; + crc1 = MM64_TABLE(0)[TO_BYTE(tmp1)]; + tmp1 >>= 8; + crc2 = MM64_TABLE(0)[TO_BYTE(tmp2)]; + tmp2 >>= 8; + crc3 = MM64_TABLE(0)[TO_BYTE(tmp3)]; + tmp3 >>= 8; + +#define XOR(byte) do { \ + crc0 = _mm_xor_si64(crc0, MM64_TABLE(byte)[TO_BYTE(tmp0)]); \ + tmp0 >>= 8; \ + crc1 = _mm_xor_si64(crc1, MM64_TABLE(byte)[TO_BYTE(tmp1)]); \ + tmp1 >>= 8; \ + crc2 = _mm_xor_si64(crc2, MM64_TABLE(byte)[TO_BYTE(tmp2)]); \ + tmp2 >>= 8; \ + crc3 = _mm_xor_si64(crc3, MM64_TABLE(byte)[TO_BYTE(tmp3)]); \ + tmp3 >>= 8; \ +} while (0) + + XOR(1); + XOR(2); + + crc0 = _mm_xor_si64(crc0, MM64_TABLE(3)[tmp0]); + tmp0 = static_cast(_mm_cvtsi64_si32(buf0)); + crc1 = _mm_xor_si64(crc1, MM64_TABLE(3)[tmp1]); + tmp1 = static_cast(_mm_cvtsi64_si32(buf1)); + crc2 = _mm_xor_si64(crc2, MM64_TABLE(3)[tmp2]); + tmp2 = static_cast(_mm_cvtsi64_si32(buf2)); + crc3 = _mm_xor_si64(crc3, MM64_TABLE(3)[tmp3]); + tmp3 = static_cast(_mm_cvtsi64_si32(buf3)); + + XOR(4); + XOR(5); + XOR(6); + +#undef XOR + + crc0 = _mm_xor_si64(crc0, MM64_TABLE(sizeof(uint64) - 1)[tmp0]); + buf0 = MM64(src)[0]; + crc1 = _mm_xor_si64(crc1, MM64_TABLE(sizeof(uint64) - 1)[tmp1]); + buf1 = MM64(src)[1]; + crc2 = _mm_xor_si64(crc2, MM64_TABLE(sizeof(uint64) - 1)[tmp2]); + buf2 = MM64(src)[2]; + crc3 = _mm_xor_si64(crc3, MM64_TABLE(sizeof(uint64) - 1)[tmp3]); + buf3 = MM64(src)[3]; + } + while (src < stop); + + CRC_WORD_MMX(this, crc0, buf0); + buf1 = _mm_xor_si64(buf1, crc1); + CRC_WORD_MMX(this, crc0, buf1); + buf2 = _mm_xor_si64(buf2, crc2); + CRC_WORD_MMX(this, crc0, buf2); + buf3 = _mm_xor_si64(buf3, crc3); + CRC_WORD_MMX(this, crc0, buf3); + + temp.m64 = crc0; + crc = temp.u64; + + _mm_empty(); + + src += 4*8; + } + + // Process sizeof(uint64) bytes at once. + bytes = static_cast(end - src) & ~(sizeof(uint64) - 1); + if (bytes > 0) { + union { + __m64 m64; + uint64 u64; + } temp; + __m64 crc0; + + temp.u64 = crc; + crc0 = temp.m64; + + for (const uint8 *stop = src + bytes; src < stop; src += sizeof(uint64)) { + __m64 buf0 = MM64(src)[0]; + CRC_WORD_MMX(this, crc0, buf0); + } + + temp.m64 = crc0; + crc = temp.u64; + + _mm_empty(); + } + + // Compute CRC of remaining bytes. + for (;src < end; ++src) { + CRC_BYTE(this, crc, *src); + } + + return (crc ^ Base().Canonize()); +} + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif // defined(_MSC_VER) + +} // namespace crcutil + +#endif // CRCUTIL_USE_ASM && HAVE_I386 && HAVE_MMX diff --git a/crcutil-1.0/code/platform.h b/crcutil-1.0/code/platform.h new file mode 100644 index 0000000..936cf7d --- /dev/null +++ b/crcutil-1.0/code/platform.h @@ -0,0 +1,245 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Detects configuration and defines compiler-specific macros. +// Also, sets user-defined CRUTIL_USE_* macros to default values. + +#ifndef CRCUTIL_PLATFORM_H_ +#define CRCUTIL_PLATFORM_H_ + +// Permanently disable some annoying warnings generated +// by Microsoft CL when compiling Microsoft's headers. +#include "std_headers.h" + +// Use inline asm version of the code? +#if !defined(CRCUTIL_USE_ASM) +#define CRCUTIL_USE_ASM 1 +#endif // !defined(CRCUTIL_USE_ASM) + + +#if !defined(HAVE_I386) +#if defined(__i386__) || defined(_M_IX86) +#define HAVE_I386 1 +#else +#define HAVE_I386 0 +#endif // defined(__i386__) || defined(_M_IX86) +#endif // defined(HAVE_I386) + + +#if !defined(HAVE_AMD64) +#if defined(__amd64__) || defined(_M_AMD64) +#define HAVE_AMD64 1 +#else +#define HAVE_AMD64 0 +#endif // defined(__amd64__) || defined(_M_AMD64) +#endif // defined(HAVE_AMD64) + + +#if HAVE_AMD64 || HAVE_I386 +#if defined(_MSC_VER) +#pragma warning(push) +// '_M_IX86' is not defined as a preprocessor macro +#pragma warning(disable: 4668) +#include +#pragma warning(pop) +#endif // defined(_MSC_VER) + + +#if !defined(HAVE_MMX) +#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__MMX__)) +#define HAVE_MMX 1 +#else +#define HAVE_MMX 0 +#endif // defined(_MSC_VER) || (defined(__GNUC__) && defined(__MMX__)) +#endif // !defined(HAVE_MMX) + + +#if !defined(HAVE_SSE) +#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__SSE__)) +#include +#define HAVE_SSE 1 +#else +#define HAVE_SSE 0 +#endif // defined(_MSC_VER) || (defined(__GNUC__) && defined(__SSE__)) +#endif // !defined(HAVE_SSE) + + +#if !defined(HAVE_SSE2) +#if defined(_MSC_VER) || (defined(__GNUC__) && defined(__SSE2__)) +#include +#define HAVE_SSE2 1 +#else +#define HAVE_SSE2 0 +#endif // defined(_MSC_VER) || (defined(__GNUC__) && defined(__SSE2__)) +#endif // !defined(HAVE_SSE2) + +#else + +#if !defined(HAVE_MMX) +#define HAVE_MMX 0 +#endif // !defined(HAVE_MMX) + +#if !defined(HAVE_SSE) +#define HAVE_SSE 0 +#endif // !defined(HAVE_SSE) + +#if !defined(HAVE_SSE2) +#define HAVE_SSE2 0 +#endif // !defined(HAVE_SSE2) + +#endif // HAVE_AMD64 || HAVE_I386 + +// Error checking +#if HAVE_SSE && !HAVE_MMX +#error SSE is available but not MMX? +#endif // HAVE_SSE && !HAVE_MMX + +#if HAVE_SSE2 && (!HAVE_SSE || !HAVE_MMX) +#error SSE2 is available but not SSE or MMX? +#endif // HAVE_SSE2 && (!HAVE_SSE || !HAVE_MMX) + + +#if !defined(CRCUTIL_PREFETCH_WIDTH) +// On newer X5550 CPU, heavily optimized CrcMultiword is 3% faster without +// prefetch for inputs smaller than 8MB and less than 1% slower for 8MB and +// larger blocks. On older Q9650 CPU, the code is 2-3% faster for inputs +// smaller than 8MB, 4-5% slower when length >= 8MB. +// Tested with prefetch length 256, 512, and 4096. +// +// At this moment there is no compelling reason to use prefetching. +// +#define CRCUTIL_PREFETCH_WIDTH 0 +#endif // !defined(CRCUTIL_PREFETCH_WIDTH) + + +#if HAVE_SSE && CRCUTIL_PREFETCH_WIDTH > 0 +#define PREFETCH(src) \ + _mm_prefetch(reinterpret_cast(src) + CRCUTIL_PREFETCH_WIDTH, \ + _MM_HINT_T0) +#else +#define PREFETCH(src) +#endif // HAVE_SSE && CRCUTIL_PREFETCH_WIDTH > 0 + + +// If block size exceeds CRCUTIL_MIN_ALIGN_SIZE, align the data +// before accessing it at word boundary. See generic_crc.cc, +// ALIGN_ON_WORD_BOUNDARY_IF_NEEDED() macro. +#if !defined(CRCUTIL_MIN_ALIGN_SIZE) +#if HAVE_AMD64 || HAVE_I386 +#define CRCUTIL_MIN_ALIGN_SIZE (1024) +#else +#define CRCUTIL_MIN_ALIGN_SIZE 0 +#endif // HAVE_AMD64 || HAVE_I386 +#endif // !defined(CRCUTIL_MIN_ALIGN_SIZE) + + +// Use _mm_crc32_u64/32/8 intrinics? +// If not, they will be implemented in software. +#if !HAVE_I386 && !HAVE_AMD64 + +#undef CRCUTIL_USE_MM_CRC32 +#define CRCUTIL_USE_MM_CRC32 0 + +#else + +#if !defined(CRCUTIL_USE_MM_CRC32) +#if defined(_MSC_VER) || defined(__GNUC__) +#define CRCUTIL_USE_MM_CRC32 1 +#else +#define CRCUTIL_USE_MM_CRC32 0 +#endif // defined(_MSC_VER) || defined(__GNUC__) +#endif // !defined(CRCUTIL_USE_MM_CRC32) + +#endif // !HAVE_I386 && !HAVE_AMD64 + + +// Stringize -- always handy. +#define TO_STRING_VALUE(arg) #arg +#define TO_STRING(arg) TO_STRING_VALUE(arg) + + +// Compilers give "right shift count >= width of type" warning even +// though the shift happens only under appropriate "if". +#define SHIFT_RIGHT_NO_WARNING(value, bits) \ + ((value) >> (((bits) < (8 * sizeof(value))) ? (bits) : 0)) +#define SHIFT_RIGHT_SAFE(value, bits) \ + ((bits) < (8 * sizeof(value)) ? SHIFT_RIGHT_NO_WARNING(value, bits) : 0) + +// The same for left shifts. +#define SHIFT_LEFT_NO_WARNING(value, bits) \ + ((value) << (((bits) < (8 * sizeof(value))) ? (bits) : 0)) +#define SHIFT_LEFT_SAFE(value, bits) \ + ((bits) < (8 * sizeof(value)) ? SHIFT_LEFT_NO_WARNING(value, bits) : 0) + +// GCC-specific macros. +// +#define GCC_VERSION_AVAILABLE(major, minor) \ + (defined(__GNUC__) && \ + (__GNUC__ > (major) || \ + (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))) + + +#if defined(__GNUC__) + +// The GenericCrc tables must be properly aligned. +// Penalty for misalignment? 50% performance degradation. +// For 128-bit SSE2, the penalty is access violation. +#define GCC_ALIGN_ATTRIBUTE(n) __attribute__((aligned(n))) + +#if GCC_VERSION_AVAILABLE(4, 4) +// If not marked as "omit frame pointer", +// GCC won't be able to find enough registers. +#define GCC_OMIT_FRAME_POINTER \ + __attribute__((__optimize__(2, "omit-frame-pointer"))) +#endif // GCC_VERSION_AVAILABLE(4, 4) + +#if !defined(__forceinline) +#define __forceinline __attribute__((__always_inline__)) inline +#endif // !defined(__forceinline) + +#if defined(__APPLE_CC__) +// The version of GCC used by Max OS X xCode v 5664 does not understand +// "movq xmm, r64" instruction and requires the use of "movd" (probably +// because of the bug in GCC which treats "movq/movd xmm,r64 or r64,xmm" +// the same). +// +// Leaving common sense aside, let's peek into Intel's instruction +// reference manual. That's what description of MOVD command says: +// MOVD xmm, r/m32 (opcode 66 0F 6E /r) +// MOVD r/m32, xmm (opcode 66 0F 7E /r) +// MOVQ xmm, r/m64 (opcode 66 REX.W 0F 6E /r) +// MOVQ r/m64, xmm (opcode 66 REX.W 0F 7E /r) +#define SSE2_MOVQ "movd" +#else +#define SSE2_MOVQ "movq" +#endif // defined(__APPLE_CC__) + +#endif // defined(__GNUC__) + + +// Define compiler-specific macros that were not set yet. +#if !defined(_MSC_VER) && !defined(__forceinline) +#define __forceinline inline +#endif // !defined(_MSC_VER) && !defined(__forceinline) + +#if !defined(GCC_OMIT_FRAME_POINTER) +#define GCC_OMIT_FRAME_POINTER +#endif // !defined(GCC_OMIT_FRAME_POINTER) + +#if !defined(GCC_ALIGN_ATTRIBUTE) +#define GCC_ALIGN_ATTRIBUTE(n) +#endif // !defined(GCC_ALIGN_ATTRIBUTE) + + +#endif // CRCUTIL_PLATFORM_H_ diff --git a/crcutil-1.0/code/protected_crc.h b/crcutil-1.0/code/protected_crc.h new file mode 100644 index 0000000..762fced --- /dev/null +++ b/crcutil-1.0/code/protected_crc.h @@ -0,0 +1,61 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Protects CRC tables with its own CRC. +// CRC tables get corrupted too, and if corruption is +// not caught, data poisoning becomes a reality. + +#ifndef CRCUTIL_PROTECTED_CRC_H_ +#define CRCUTIL_PROTECTED_CRC_H_ + +namespace crcutil { + +#pragma pack(push, 16) + +// Class CrcImplementation should not have virtual functions: +// vptr is stored as the very first field, vptr value is defined +// at runtime, so it is impossible to CRC(*this) once and +// guarantee that this value will not change from run to run. +// +template class ProtectedCrc + : public CrcImplementation { + public: + typedef typename CrcImplementation::Crc Crc; + + // Returns check value that the caller should compare + // against pre-computed, trusted constant. + // + // Computing SelfCheckValue() after CRC initialization, + // storing it in memory, and periodically checking against + // stored value may not work: if CRC tables were initialized + // incorrectly and/or had been corrupted during initialization, + // CheckValue() will return garbage. Garbage in, garbage out. + // Consequitive checks will not detect a problem, the application + // will happily produce and save the data with corrupt CRC. + // + // The application should call SelfCheckValue() regularly: + // 1. First and foremost, on every CRC mismatch. + // 2. After CRC'ing the data but before sending it out or writing it. + // 3. Worst case, every Nth CRC'ed byte or every Nth call to CRC. + // + Crc SelfCheckValue() const { + return CrcDefault(this, sizeof(*this), 0); + } +} GCC_ALIGN_ATTRIBUTE(16); + +#pragma pack(pop) + +} // namespace crcutil + +#endif // CRCUTIL_PROTECTED_CRC_H_ diff --git a/crcutil-1.0/code/rolling_crc.h b/crcutil-1.0/code/rolling_crc.h new file mode 100644 index 0000000..ad4a947 --- /dev/null +++ b/crcutil-1.0/code/rolling_crc.h @@ -0,0 +1,106 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements rolling CRC (e.g. for Rabin fingerprinting). + +#ifndef CRCUTIL_ROLLING_CRC_H_ +#define CRCUTIL_ROLLING_CRC_H_ + +#include "base_types.h" // size_t, uint8 +#include "crc_casts.h" // TO_BYTE + +namespace crcutil { + +#pragma pack(push, 16) + +// CrcImplementation should provide: +// - typename Crc +// - typename TableEntry +// - typename Word +// - Crc CrcDefault(const void *data, size_t bytes, const Crc &start) +// - const GfUtil &Base() const +template class RollingCrc { + public: + typedef typename CrcImplementation::Crc Crc; + typedef typename CrcImplementation::TableEntry TableEntry; + typedef typename CrcImplementation::Word Word; + + RollingCrc() {} + + // Initializes internal data structures. + // Retains reference to "crc" instance -- it is used by Start(). + RollingCrc(const CrcImplementation &crc, + size_t roll_window_bytes, + const Crc &start_value) { + Init(crc, roll_window_bytes, start_value); + } + + // Computes crc of "roll_window_bytes" using + // "start_value" of "crc" (see Init()). + Crc Start(const void *data) const { + return crc_->CrcDefault(data, roll_window_bytes_, start_value_); + } + + // Computes CRC of "roll_window_bytes" starting in next position. + Crc Roll(const Crc &old_crc, size_t byte_out, size_t byte_in) const { + return (old_crc >> 8) ^ in_[TO_BYTE(old_crc) ^ byte_in] ^ out_[byte_out]; + } + + // Initializes internal data structures. + // Retains reference to "crc" instance -- it is used by Start(). + void Init(const CrcImplementation &crc, + size_t roll_window_bytes, + const Crc &start_value) { + crc_ = &crc; + roll_window_bytes_ = roll_window_bytes; + start_value_ = start_value; + + Crc add = crc.Base().Canonize() ^ start_value; + add = crc.Base().Multiply(add, crc.Base().Xpow8N(roll_window_bytes)); + add ^= crc.Base().Canonize(); + Crc mul = crc.Base().One() ^ crc.Base().Xpow8N(1); + add = crc.Base().Multiply(add, mul); + + mul = crc.Base().XpowN(8 * roll_window_bytes + crc.Base().Degree()); + for (size_t i = 0; i < 256; ++i) { + out_[i] = static_cast( + crc.Base().MultiplyUnnormalized( + static_cast(i), 8, mul) ^ add); + } + for (size_t i = 0; i < 256; ++i) { + in_[i] = crc.crc_word_[sizeof(Word) - 1][i]; + } + } + + // Returns start value. + Crc StartValue() const { return start_value_; } + + // Returns length of roll window. + size_t WindowBytes() const { return roll_window_bytes_; } + + protected: + TableEntry in_[256]; + TableEntry out_[256]; + + // Used only by Start(). + Crc start_value_; + const CrcImplementation *crc_; + size_t roll_window_bytes_; +} GCC_ALIGN_ATTRIBUTE(16); + +#pragma pack(pop) + +} // namespace crcutil + +#endif // CRCUTIL_ROLLING_CRC_H_ diff --git a/crcutil-1.0/code/std_headers.h b/crcutil-1.0/code/std_headers.h new file mode 100644 index 0000000..5c7b6a3 --- /dev/null +++ b/crcutil-1.0/code/std_headers.h @@ -0,0 +1,51 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Includes some standard C headers for size_t, memset, etc. +// +// Also, permanently disables a number of warnings produced +// by Microsoft's compiler when it includes standard headers +// (surprisingly, also by Microsoft). + +#ifndef CRCUTIL_STD_HEADERS_H_ +#define CRCUTIL_STD_HEADERS_H_ + +#if defined(_MSC_VER) +// '4' bytes padding added after data member ... +#pragma warning(disable:4820) + +// unreferenced inline function has been removed ... +#pragma warning(disable:4514) + +// conditional expression is constant +#pragma warning(disable: 4127) + +// function ... not inlined +#pragma warning(disable: 4710) + +// function ... selected for automatic inline expansion +#pragma warning(disable: 4711) + +#define _CRT_SECURE_NO_WARNINGS + +#endif // defined(_MSC_VER) + +// #define _CSTDLIB_ +#include // always handy +#include // memset +#include // size_t, _rotl/_rotl64(MSC) +#include // ptrdiff_t (GNUC) +#include // va_list + +#endif // CRCUTIL_STD_HEADERS_H_ diff --git a/crcutil-1.0/code/uint128_sse2.h b/crcutil-1.0/code/uint128_sse2.h new file mode 100644 index 0000000..24b4072 --- /dev/null +++ b/crcutil-1.0/code/uint128_sse2.h @@ -0,0 +1,310 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Implements a limited set of 128-bit arithmetic operations +// (the ones that are used by CRC) using SSE2 intrinsics. + +#ifndef CRCUTIL_UINT128_SSE2_H_ +#define CRCUTIL_UINT128_SSE2_H_ + +#include "base_types.h" +#include "crc_casts.h" // Downcast, CrcFromUint64, Uint64FromCrc +#include "platform.h" + +#if HAVE_SSE2 + +namespace crcutil { + +// Specialized functions handling __m128i. +template<> __forceinline uint64 Downcast(const __m128i &value) { +#if HAVE_AMD64 && defined(__GNUC__) + // GCC 4.4.x is too smart and, instead of MOVQ, generates SSE4 PEXTRQ + // instruction when the code is compiled with -mmsse4. + // Fixed in 4.5 which generates conversion through memory (why?). + // And -- yes, it makes quite measurable difference. + uint64 temp; + asm(SSE2_MOVQ " %[i128], %[u64]\n" : [u64] "=r" (temp) : [i128] "x" (value)); + return temp; +#elif HAVE_AMD64 && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 150030729) + return static_cast(_mm_cvtsi128_si64(value)); +#else + // 64-bit CL 15.00.30729.1 -O2 generates incorrect code (tests fail). + // _mm_cvtsi128_si64() is not available on i386. + uint64 temp; + _mm_storel_epi64(reinterpret_cast<__m128i *>(&temp), value); + return temp; +#endif +} + + +class uint128_sse2 { + public: + uint128_sse2() {} + ~uint128_sse2() {} + + // Default casts to uint128_sse2 and assignment operator. + __forceinline void operator =(uint64 value) { +#if HAVE_AMD64 && defined(__GNUC__) && !GCC_VERSION_AVAILABLE(4, 5) + // Prevent generation of SSE4 pinsrq insruction when + // compiling with GCC 4.4.x with -msse4 flag. + asm(SSE2_MOVQ " %[u64], %[i128]\n" : [i128] "=x" (x_) : [u64] "r" (value)); +#elif HAVE_AMD64 + x_ = _mm_cvtsi64_si128(static_cast(value)); +#else + x_ = _mm_loadl_epi64(reinterpret_cast(&value)); +#endif + } + __forceinline uint128_sse2(uint64 x) { + *this = x; + } + __forceinline uint128_sse2(const __m128i x) : x_(x) { + } + __forceinline operator __m128i() const { + return x_; + } + __forceinline void operator =(const uint128_sse2 &x) { + x_ = x.x_; + } + + // Extracts 64 less significant bits. + __forceinline uint64 to_uint64() const { + return Downcast<__m128i, uint64>(x_); + } + + // Comparisons. + __forceinline bool operator ==(const uint128_sse2 &y) const { + union { + __m128i i128; + uint64 u64[2]; + } t; + t.i128 = _mm_xor_si128(x_, y.x_); + return (t.u64[0] | t.u64[1]) == 0; + } + __forceinline bool operator ==(uint64 value) const { + union { + __m128i i128; + uint64 u64[2]; + } t; + t.i128 = x_; + return (t.u64[0] == value && t.u64[1] == 0); + } + __forceinline bool operator !=(const uint128_sse2 &y) const { + union { + __m128i i128; + uint64 u64[2]; + } t; + t.i128 = _mm_xor_si128(x_, y.x_); + return (t.u64[0] | t.u64[1]) != 0; + } + __forceinline bool operator !=(uint64 value) const { + union { + __m128i i128; + uint64 u64[2]; + } t; + t.i128 = x_; + return (t.u64[0] != value || t.u64[1] != 0); + } + + __forceinline bool operator <(const uint128_sse2 &y) const { + union { + __m128i i128; + uint64 u64[2]; + } xx, yy; + xx.i128 = x_; + yy.i128 = y.x_; + return (xx.u64[0] < yy.u64[0] || + (xx.u64[0] == yy.u64[0] && xx.u64[1] < yy.u64[1])); + } + + // Bitwise logic operators. + __forceinline uint128_sse2 operator ^(const uint128_sse2 &y) const { + return _mm_xor_si128(x_, y.x_); + } + __forceinline uint128_sse2 operator &(const uint128_sse2 &y) const { + return _mm_and_si128(x_, y.x_); + } + __forceinline uint128_sse2 operator |(const uint128_sse2 &y) const { + return _mm_or_si128(x_, y.x_); + } + + __forceinline void operator ^=(const uint128_sse2 &y) { + *this = *this ^ y.x_; + } + __forceinline void operator &=(const uint128_sse2 &y) { + *this = *this & y.x_; + } + __forceinline void operator |=(const uint128_sse2 &y) { + *this = *this | y.x_; + } + + // Arithmetic operators. + __forceinline uint128_sse2 operator +(uint64 y) const { + union { + __m128i i128; + uint64 u64[2]; + } temp; + temp.i128 = x_; + // a + b >= 2**64 iff + // a + b > (2**64 - 1) iff + // a > (2**64 - 1) - b iff + // a > ~b + if (temp.u64[0] > ~y) { + temp.u64[1] += 1; + } + temp.u64[0] += y; + return temp.i128; + } + __forceinline void operator +=(uint64 x) { + *this = *this + x; + } + __forceinline uint128_sse2 operator -(uint64 y) const { + union { + __m128i i128; + uint64 u64[2]; + } temp; + temp.i128 = x_; + if (temp.u64[0] < y) { + temp.u64[1] -= 1; + } + temp.u64[0] -= y; + return temp.i128; + } + __forceinline void operator -=(uint64 x) { + *this = *this - x; + } + + // Bitwise logical shifts. + __forceinline uint128_sse2 operator >>(const int bits) const { + if (bits == 8) { + return _mm_srli_si128(x_, 1); + } else if (bits == 16) { + return _mm_srli_si128(x_, 2); + } else if (bits == 32) { + return _mm_srli_si128(x_, 4); + } else if (bits == 64) { + return _mm_srli_si128(x_, 8); + } else { + return long_shift_right(bits); + } + } + __forceinline uint128_sse2 operator >>(const size_t bits) const { + return *this >> static_cast(bits); + } + __forceinline void operator >>=(const int bits) { + *this = *this >> bits; + } + __forceinline void operator >>=(const size_t bits) { + *this = *this >> static_cast(bits); + } + + __forceinline uint128_sse2 operator <<(int bits) const { + if (bits == 8) { + return _mm_slli_si128(x_, 1); + } else if (bits == 16) { + return _mm_slli_si128(x_, 2); + } else if (bits == 32) { + return _mm_slli_si128(x_, 4); + } else if (bits == 64) { + return _mm_slli_si128(x_, 8); + } else { + return long_shift_left(bits); + } + } + __forceinline uint128_sse2 operator <<(size_t bits) const { + return *this << static_cast(bits); + } + __forceinline void operator <<=(int bits) { + *this = *this << bits; + } + __forceinline void operator <<=(size_t bits) { + *this = *this << static_cast(bits); + } + + protected: + __forceinline uint128_sse2 long_shift_right(int bits) const { + union { + __m128i i128; + uint64 u64[2]; + } x; + x.i128 = x_; + for (; bits > 0; --bits) { + x.u64[0] >>= 1; + if (x.u64[1] & 1) { + x.u64[0] |= static_cast(1) << 63; + } + x.u64[1] >>= 1; + } + return x.i128; + } + + __forceinline uint128_sse2 long_shift_left(int bits) const { + union { + __m128i i128; + int64 i64[2]; + } x; + x.i128 = x_; + for (; bits > 0; --bits) { + x.i64[1] <<= 1; + if (x.i64[0] < 0) { + x.i64[1] |= 1; + } + x.i64[0] <<= 1; + } + return x.i128; + } + + __m128i x_; +} GCC_ALIGN_ATTRIBUTE(16); + + +// Specialized versions. +template<> __forceinline uint64 Downcast(const uint128_sse2 &x) { + return x.to_uint64(); +} +template<> __forceinline uint32 Downcast(const uint128_sse2 &x) { + return static_cast(x.to_uint64()); +} +template<> __forceinline uint16 Downcast(const uint128_sse2 &x) { + return static_cast(x.to_uint64()); +} +template<> __forceinline uint8 Downcast(const uint128_sse2 &x) { + return static_cast(x.to_uint64()); +} + +template<> __forceinline uint128_sse2 CrcFromUint64(uint64 lo, uint64 hi) { + union { + __m128i i128; + uint64 u64[2]; + } temp; + temp.u64[0] = lo; + temp.u64[1] = hi; + return temp.i128; +} + +template<> __forceinline void Uint64FromCrc(const uint128_sse2 &crc, + uint64 *lo, uint64 *hi) { + union { + __m128i i128; + uint64 u64[2]; + } temp; + temp.i128 = crc; + *lo = temp.u64[0]; + *hi = temp.u64[1]; +} + +} // namespace crcutil + +#endif // HAVE_SSE2 + +#endif // CRCUTIL_UINT128_SSE2_H_ diff --git a/crcutil-1.0/config.h.in b/crcutil-1.0/config.h.in new file mode 100644 index 0000000..c8fea3c --- /dev/null +++ b/crcutil-1.0/config.h.in @@ -0,0 +1,85 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `memset' function. */ +#undef HAVE_MEMSET + +/* Define to 1 if the system has the type `ptrdiff_t'. */ +#undef HAVE_PTRDIFF_T + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strchr' function. */ +#undef HAVE_STRCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strrchr' function. */ +#undef HAVE_STRRCHR + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Version number of package */ +#undef VERSION + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/crcutil-1.0/configure b/crcutil-1.0/configure new file mode 100755 index 0000000..e84a5fb --- /dev/null +++ b/crcutil-1.0/configure @@ -0,0 +1,7307 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.65 for crcutil 1.0. +# +# Report bugs to . +# +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, +# Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + # We cannot yet assume a decent shell, so we have to provide a + # neutralization value for shells without unset; and this also + # works around shells that cannot unset nonexistent variables. + BASH_ENV=/dev/null + ENV=/dev/null + (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: crcutil@googlegroups.com about your system, including +$0: any error possibly output before this message. Then +$0: install a modern shell, or manually run the script +$0: under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='crcutil' +PACKAGE_TARNAME='crcutil' +PACKAGE_VERSION='1.0' +PACKAGE_STRING='crcutil 1.0' +PACKAGE_BUGREPORT='crcutil@googlegroups.com' +PACKAGE_URL='' + +ac_unique_file="tests/aligned_alloc.h" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +EGREP +GREP +CPP +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +ac_ct_CC +CFLAGS +CC +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CXX +CPPFLAGS +LDFLAGS +CXXFLAGS +CXX +LTLIBOBJS +LIBOBJS +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_dependency_tracking +' + ac_precious_vars='build_alias +host_alias +target_alias +CXX +CXXFLAGS +LDFLAGS +LIBS +CPPFLAGS +CCC +CC +CFLAGS +CPP' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information." + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures crcutil 1.0 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/crcutil] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of crcutil 1.0:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + +Some influential environment variables: + CXX C++ compiler command + CXXFLAGS C++ compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CC C compiler command + CFLAGS C compiler flags + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +crcutil configure 1.0 +generated by GNU Autoconf 2.65 + +Copyright (C) 2009 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_cpp + +# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists, giving a warning if it cannot be compiled using +# the include files in INCLUDES and setting the cache variable VAR +# accordingly. +ac_fn_c_check_header_mongrel () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 +$as_echo_n "checking $2 usability... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_header_compiler=yes +else + ac_header_compiler=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 +$as_echo_n "checking $2 presence... " >&6; } +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include <$2> +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + ac_header_preproc=yes +else + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( + yes:no: ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} + ;; + no:yes:* ) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} +( cat <<\_ASBOX +## --------------------------------------- ## +## Report this to crcutil@googlegroups.com ## +## --------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=\$ac_header_compiler" +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +fi + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_mongrel + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_header_compile + +# ac_fn_c_check_type LINENO TYPE VAR INCLUDES +# ------------------------------------------- +# Tests whether TYPE exists after having included INCLUDES, setting cache +# variable VAR accordingly. +ac_fn_c_check_type () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + eval "$3=no" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof ($2)) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +if (sizeof (($2))) + return 0; + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + eval "$3=yes" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_type + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case declares $2. + For example, HP-UX 11i declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} + +} # ac_fn_c_check_func +cat >config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by crcutil $as_me 1.0, which was +generated by GNU Autoconf 2.65. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +am__api_version='1.11' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + for ac_t in install-sh install.sh shtool; do + if test -f "$ac_dir/$ac_t"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/$ac_t -c" + break 2 + fi + done +done +if test -z "$ac_aux_dir"; then + as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Just in case +sleep 1 +echo timestamp > conftest.file +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;; +esac + +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error "ls -t appears to fail. Make sure there is not a broken +alias in your environment" "$LINENO" 5 + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if test "${ac_cv_path_mkdir+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +mkdir_p="$MKDIR_P" +case $mkdir_p in + [\\/$]* | ?:[\\/]*) ;; + */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; +esac + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE=crcutil + VERSION=1.0 + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +# Always define AMTAR for backward compatibility. + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' + + + + + +ac_config_files="$ac_config_files Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.h` + + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by crcutil $as_me 1.0, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + +Configuration files: +$config_files + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +crcutil config.status 1.0 +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h | --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + + +eval set X " :F $CONFIG_FILES " +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + + + + esac + +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +ac_config_headers="$ac_config_headers config.h" + + +# Checks for programs. +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C++ compiler works" >&5 +$as_echo_n "checking whether the C++ compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ as_fn_set_status 77 +as_fn_error "C++ compiler cannot create executables +See \`config.log' for more details." "$LINENO" 5; }; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler default output file name" >&5 +$as_echo_n "checking for C++ compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot run C++ compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "cannot compute suffix of object files: cannot compile +See \`config.log' for more details." "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from `make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "no acceptable C compiler found in \$PATH +See \`config.log' for more details." "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvisualcpp | msvcmsys) + # This compiler won't grok `-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + + +# Checks for libraries. + +# Checks for header files. + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 +$as_echo_n "checking how to run the C preprocessor... " >&6; } +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 +$as_echo "$CPP" >&6; } +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + +else + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +_ACEOF +if ac_fn_c_try_cpp "$LINENO"; then : + # Broken: success on invalid input. +continue +else + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then : + +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error "C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." "$LINENO" 5; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$GREP"; then + ac_path_GREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in grep ggrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue +# Check for GNU ac_path_GREP and select it if it is found. + # Check for GNU $ac_path_GREP +case `"$ac_path_GREP" --version 2>&1` in +*GNU*) + ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'GREP' >> "conftest.nl" + "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_GREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_GREP="$ac_path_GREP" + ac_path_GREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_GREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_GREP"; then + as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 + then ac_cv_path_EGREP="$GREP -E" + else + if test -z "$EGREP"; then + ac_path_EGREP_found=false + # Loop through the user's path and test for each of PROGNAME-LIST + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in egrep; do + for ac_exec_ext in '' $ac_executable_extensions; do + ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" + { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue +# Check for GNU ac_path_EGREP and select it if it is found. + # Check for GNU $ac_path_EGREP +case `"$ac_path_EGREP" --version 2>&1` in +*GNU*) + ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; +*) + ac_count=0 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo 'EGREP' >> "conftest.nl" + "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break + diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break + as_fn_arith $ac_count + 1 && ac_count=$as_val + if test $ac_count -gt ${ac_path_EGREP_max-0}; then + # Best one so far, save it but keep looking for a better one + ac_cv_path_EGREP="$ac_path_EGREP" + ac_path_EGREP_max=$ac_count + fi + # 10*(2^10) chars as input seems more than enough + test $ac_count -gt 10 && break + done + rm -f conftest.in conftest.tmp conftest.nl conftest.out;; +esac + + $ac_path_EGREP_found && break 3 + done + done + done +IFS=$as_save_IFS + if test -z "$ac_cv_path_EGREP"; then + as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdc=yes +else + ac_cv_header_stdc=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then : + +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then : + : +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + +else + ac_cv_header_stdc=no +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +$as_echo "#define STDC_HEADERS 1" >>confdefs.h + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default +" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in stddef.h stdlib.h string.h +do : + as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +eval as_val=\$$as_ac_Header + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +# Checks for typedefs, structures, and compiler characteristics. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdbool.h that conforms to C99" >&5 +$as_echo_n "checking for stdbool.h that conforms to C99... " >&6; } +if test "${ac_cv_header_stdbool_h+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +#ifndef bool + "error: bool is not defined" +#endif +#ifndef false + "error: false is not defined" +#endif +#if false + "error: false is not 0" +#endif +#ifndef true + "error: true is not defined" +#endif +#if true != 1 + "error: true is not 1" +#endif +#ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" +#endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) 0.5 == true ? 1 : -1]; + bool e = &s; + char f[(_Bool) 0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + enum { j = false, k = true, l = false * true, m = true * 256 }; + /* The following fails for + HP aC++/ANSI C B3910B A.05.55 [Dec 04 2003]. */ + _Bool n[m]; + char o[sizeof n == m * sizeof n[0] ? 1 : -1]; + char p[-1 - (_Bool) 0 < 0 && -1 - (bool) 0 < 0 ? 1 : -1]; +# if defined __xlc__ || defined __GNUC__ + /* Catch a bug in IBM AIX xlc compiler version 6.0.0.0 + reported by James Lemley on 2005-10-05; see + http://lists.gnu.org/archive/html/bug-coreutils/2005-10/msg00086.html + This test is not quite right, since xlc is allowed to + reject this program, as the initializer for xlcbug is + not one of the forms that C requires support for. + However, doing the test right would require a runtime + test, and that would make cross-compilation harder. + Let us hope that IBM fixes the xlc bug, and also adds + support for this kind of constant expression. In the + meantime, this test will reject xlc, which is OK, since + our stdbool.h substitute should suffice. We also test + this with GCC, where it should work, to detect more + quickly whether someone messes up the test in the + future. */ + char digs[] = "0123456789"; + int xlcbug = 1 / (&(digs + 5)[-2 + (bool) 1] == &digs[4] ? 1 : -1); +# endif + /* Catch a bug in an HP-UX C compiler. See + http://gcc.gnu.org/ml/gcc-patches/2003-12/msg02303.html + http://lists.gnu.org/archive/html/bug-coreutils/2005-11/msg00161.html + */ + _Bool q = true; + _Bool *pq = &q; + +int +main () +{ + + *pq |= q; + *pq |= ! q; + /* Refer to every declared value, to avoid compiler optimizations. */ + return (!a + !b + !c + !d + !e + !f + !g + !h + !i + !!j + !k + !!l + + !m + !n + !o + !p + !q + !pq); + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_header_stdbool_h=yes +else + ac_cv_header_stdbool_h=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdbool_h" >&5 +$as_echo "$ac_cv_header_stdbool_h" >&6; } +ac_fn_c_check_type "$LINENO" "_Bool" "ac_cv_type__Bool" "$ac_includes_default" +if test "x$ac_cv_type__Bool" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE__BOOL 1 +_ACEOF + + +fi + +if test $ac_cv_header_stdbool_h = yes; then + +$as_echo "#define HAVE_STDBOOL_H 1" >>confdefs.h + +fi + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_c_inline=$ac_kw +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" +if test "x$ac_cv_type_size_t" = x""yes; then : + +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +ac_fn_c_check_type "$LINENO" "ptrdiff_t" "ac_cv_type_ptrdiff_t" "$ac_includes_default" +if test "x$ac_cv_type_ptrdiff_t" = x""yes; then : + +cat >>confdefs.h <<_ACEOF +#define HAVE_PTRDIFF_T 1 +_ACEOF + + +fi + + +# Checks for library functions. +for ac_func in memset strchr strrchr +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +eval as_val=\$$as_ac_var + if test "x$as_val" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: ${CONFIG_STATUS=./config.status} +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error ERROR [LINENO LOG_FD] +# --------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with status $?, using 1 if that was 0. +as_fn_error () +{ + as_status=$?; test $as_status -eq 0 && as_status=1 + if test "$3"; then + as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 + fi + $as_echo "$as_me: error: $1" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in #( + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by crcutil $as_me 1.0, which was +generated by GNU Autoconf 2.65. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +crcutil config.status 1.0 +configured by $0, generated by GNU Autoconf 2.65, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2009 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + + *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || as_fn_error "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&2;} + + rm -f "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || as_fn_error "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Autoconf 2.62 quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit $? +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/crcutil-1.0/configure.ac b/crcutil-1.0/configure.ac new file mode 100644 index 0000000..5247524 --- /dev/null +++ b/crcutil-1.0/configure.ac @@ -0,0 +1,32 @@ +# -*- Autoconf -*- +# Process this file with autoconf to produce a configure script. + +AC_PREREQ([2.65]) +AC_INIT(crcutil, 1.0, crcutil@googlegroups.com) +AM_INIT_AUTOMAKE(crcutil, 1.0) +AC_CONFIG_FILES([Makefile]) +AC_OUTPUT() +AC_CONFIG_SRCDIR([tests/aligned_alloc.h]) +AC_CONFIG_HEADERS([config.h]) + +# Checks for programs. +AC_PROG_CXX +AC_PROG_CC +AC_PROG_INSTALL +AC_PROG_MAKE_SET + +# Checks for libraries. + +# Checks for header files. +AC_CHECK_HEADERS([stddef.h stdlib.h string.h]) + +# Checks for typedefs, structures, and compiler characteristics. +AC_HEADER_STDBOOL +AC_C_INLINE +AC_TYPE_SIZE_T +AC_CHECK_TYPES([ptrdiff_t]) + +# Checks for library functions. +AC_CHECK_FUNCS([memset strchr strrchr]) + +AC_OUTPUT diff --git a/crcutil-1.0/depcomp b/crcutil-1.0/depcomp new file mode 100755 index 0000000..df8eea7 --- /dev/null +++ b/crcutil-1.0/depcomp @@ -0,0 +1,630 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u="sed s,\\\\\\\\,/,g" + depmode=msvisualcpp +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> "$depfile" + echo >> "$depfile" + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" + # Add `dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # With Tru64 cc, shared objects can also be used to make a + # static library. This mechanism is used in libtool 1.4 series to + # handle both shared and static libraries in a single compilation. + # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. + # + # With libtool 1.5 this exception was removed, and libtool now + # generates 2 separate objects for the 2 libraries. These two + # compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 + tmpdepfile2=$dir$base.o.d # libtool 1.5 + tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 + tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.o.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + tmpdepfile4=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/crcutil-1.0/doc/crc.pdf b/crcutil-1.0/doc/crc.pdf new file mode 100644 index 0000000..d6942ec Binary files /dev/null and b/crcutil-1.0/doc/crc.pdf differ diff --git a/crcutil-1.0/doc/data/test-cl-32-1.csv b/crcutil-1.0/doc/data/test-cl-32-1.csv new file mode 100644 index 0000000..e35176d --- /dev/null +++ b/crcutil-1.0/doc/data/test-cl-32-1.csv @@ -0,0 +1,310 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 128, 16, 16, 8, 4, 0, 66736, 1477341 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 13.002, 32.502, 33.419, 33.502, 32.752, 33.252, 33.002,, 32.502, Byte + 8, 6.313, 22.751, 23.001, 23.064, 13.912, 17.501, 14.970,, 13.912, Word + 16, 3.719, 17.376, 17.751, 16.626, 9.688, 12.438, 9.969,, 9.688, Word + 32, 3.157, 14.969, 15.094, 14.001, 7.188, 9.751, 7.376,, 7.188, Word + 64, 1.938, 13.675, 13.743, 12.782, 5.923, 8.438, 6.565,, 5.923, Word + 128, 1.313, 13.141, 13.008, 12.133, 5.297, 7.664, 5.315,, 5.297, Word + 256, 1.024, 12.774, 12.665, 11.747, 5.039, 7.309, 4.680,, 4.680, Multiword + 512, 0.884, 12.586, 12.522, 11.549, 4.882, 7.146, 4.436,, 4.436, Multiword + 1024, 0.807, 12.491, 12.424, 11.451, 5.013, 7.209, 4.365,, 4.365, Multiword + 2048, 0.772, 12.445, 12.377, 11.401, 4.987, 7.220, 4.318,, 4.318, Multiword + 4096, 0.759, 12.414, 12.351, 11.377, 4.994, 7.177, 4.251,, 4.251, Multiword + 8192, 0.747, 12.394, 12.340, 11.375, 4.991, 7.179, 4.217,, 4.217, Multiword + 16384, 0.741, 12.153, 12.333, 11.360, 5.036, 7.197, 4.204,, 4.204, Multiword + 32768, 0.739, 12.204, 12.330, 11.356, 5.029, 7.188, 4.187,, 4.187, Multiword + 65536, 0.737, 12.074, 12.329, 11.354, 5.024, 5.517, 4.187,, 4.187, Multiword + 131072, 0.736, 12.257, 12.332, 11.354, 5.035, 5.177, 4.191,, 4.191, Multiword + 262144, 0.735, 12.379, 12.420, 11.418, 5.050, 5.021, 4.196,, 4.196, Multiword + 524288, 0.735, 12.507, 12.450, 11.467, 5.100, 4.982, 4.235,, 4.235, Multiword + 1048576, 0.735, 12.615, 12.486, 11.492, 5.127, 4.799, 4.241,, 4.241, Multiword + 2097152, 0.736, 12.726, 12.511, 11.500, 5.141, 4.798, 4.251,, 4.251, Multiword + 4194304, 0.741, 12.756, 12.541, 11.535, 5.157, 4.801, 4.269,, 4.269, Multiword + 8388608, 0.850, 13.046, 12.788, 11.777, 5.323, 4.951, 4.418,, 4.418, Multiword + 16777216, 0.849, 13.036, 12.798, 11.789, 5.337, 4.948, 4.423,, 4.423, Multiword + 33554432, 0.852, 13.067, 12.785, 11.808, 5.343, 4.954, 4.438,, 4.438, Multiword + 67108864, 0.851, 13.086, 12.813, 11.808, 5.338, 4.944, 4.434,, 4.434, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 128, 16, 16, 8, 3, 0, 66736, 1424205 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 33.254, 34.003,, 33.254, Blockword + 8, 15.502, 14.752,, 14.752, Multiword + 16, 10.002, 9.970,, 9.970, Multiword + 32, 7.532, 7.376,, 7.376, Multiword + 64, 6.032, 6.376,, 6.032, Blockword + 128, 5.402, 5.116,, 5.116, Multiword + 256, 4.961, 4.490,, 4.490, Multiword + 512, 4.923, 4.180,, 4.180, Multiword + 1024, 4.978, 4.210,, 4.210, Multiword + 2048, 5.046, 4.135,, 4.135, Multiword + 4096, 4.973, 4.076,, 4.076, Multiword + 8192, 5.003, 4.029,, 4.029, Multiword + 16384, 5.044, 4.013,, 4.013, Multiword + 32768, 5.040, 3.999,, 3.999, Multiword + 65536, 5.178, 4.009,, 4.009, Multiword + 131072, 4.855, 4.013,, 4.013, Multiword + 262144, 4.570, 4.016,, 4.016, Multiword + 524288, 4.435, 4.059,, 4.059, Multiword + 1048576, 4.443, 4.062,, 4.062, Multiword + 2097152, 4.407, 4.083,, 4.083, Multiword + 4194304, 4.431, 4.099,, 4.099, Multiword + 8388608, 4.554, 4.245,, 4.245, Multiword + 16777216, 4.563, 4.252,, 4.252, Multiword + 33554432, 4.550, 4.263,, 4.263, Multiword + 67108864, 4.534, 4.261,, 4.261, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 128, 16, 16, 4, 4, 0, 33968, 1328148 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 11.503, 32.504, 33.420, 33.502, 26.821, 27.253, 26.289,, 26.289, Multiword + 8, 6.501, 22.752, 22.939, 23.064, 15.064, 15.755, 15.501,, 15.064, Word + 16, 6.063, 17.376, 17.751, 16.626, 10.001, 10.938, 10.125,, 10.001, Word + 32, 3.376, 14.969, 15.094, 14.001, 7.157, 7.751, 7.657,, 7.157, Word + 64, 1.985, 13.674, 13.743, 12.782, 6.084, 6.297, 5.110,, 5.110, Multiword + 128, 1.399, 13.250, 13.008, 12.133, 5.407, 5.501, 3.964,, 3.964, Multiword + 256, 1.098, 13.050, 12.665, 11.747, 5.064, 5.184, 3.379,, 3.379, Multiword + 512, 0.956, 12.951, 12.522, 11.550, 4.925, 5.032, 3.095,, 3.095, Multiword + 1024, 0.884, 12.892, 12.424, 11.451, 4.843, 4.929, 2.950,, 2.950, Multiword + 2048, 0.857, 12.861, 12.377, 11.402, 4.841, 4.822, 2.872,, 2.872, Multiword + 4096, 0.835, 12.823, 12.351, 11.377, 4.806, 4.805, 2.823,, 2.823, Multiword + 8192, 0.824, 12.691, 12.340, 11.375, 4.796, 4.801, 2.808,, 2.808, Multiword + 16384, 0.818, 12.513, 12.333, 11.360, 4.791, 4.794, 2.802,, 2.802, Multiword + 32768, 0.817, 12.522, 12.330, 11.356, 4.793, 4.813, 2.797,, 2.797, Multiword + 65536, 0.815, 12.422, 12.329, 11.354, 4.793, 3.882, 2.795,, 2.795, Multiword + 131072, 0.814, 12.259, 12.332, 11.351, 4.789, 3.548, 2.794,, 2.794, Multiword + 262144, 0.813, 12.302, 12.417, 11.434, 4.792, 3.387, 2.795,, 2.795, Multiword + 524288, 0.813, 12.408, 12.462, 11.480, 4.831, 3.306, 2.796,, 2.796, Multiword + 1048576, 0.813, 12.434, 12.492, 11.491, 4.838, 3.190, 2.814,, 2.814, Multiword + 2097152, 0.814, 12.465, 12.511, 11.504, 4.846, 3.181, 2.832,, 2.832, Multiword + 4194304, 0.819, 12.544, 12.558, 11.551, 4.868, 3.181, 2.840,, 2.840, Multiword + 8388608, 0.930, 12.757, 12.798, 11.721, 5.019, 3.306, 2.971,, 2.971, Multiword + 16777216, 0.928, 12.799, 12.801, 11.798, 5.045, 3.321, 2.981,, 2.981, Multiword + 33554432, 0.932, 12.792, 12.790, 11.807, 5.042, 3.311, 2.988,, 2.988, Multiword + 67108864, 0.936, 12.800, 12.824, 11.809, 5.055, 3.309, 2.978,, 2.978, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 128, 16, 16, 4, 3, 0, 33968, 1304055 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 27.337, 26.163,, 26.163, Multiword + 8, 15.254, 15.252,, 15.252, Multiword + 16, 10.070, 10.453,, 10.070, Blockword + 32, 7.501, 8.157,, 7.501, Blockword + 64, 5.954, 5.344,, 5.344, Multiword + 128, 5.340, 4.072,, 4.072, Multiword + 256, 4.989, 3.399,, 3.399, Multiword + 512, 4.899, 3.066,, 3.066, Multiword + 1024, 4.818, 2.864,, 2.864, Multiword + 2048, 4.758, 2.785,, 2.785, Multiword + 4096, 4.730, 2.736,, 2.736, Multiword + 8192, 4.718, 2.725,, 2.725, Multiword + 16384, 4.713, 2.721,, 2.721, Multiword + 32768, 4.710, 2.720,, 2.720, Multiword + 65536, 4.176, 2.719,, 2.719, Multiword + 131072, 3.856, 2.717,, 2.717, Multiword + 262144, 3.391, 2.717,, 2.717, Multiword + 524288, 3.160, 2.717,, 2.717, Multiword + 1048576, 3.141, 2.739,, 2.739, Multiword + 2097152, 3.096, 2.752,, 2.752, Multiword + 4194304, 3.095, 2.753,, 2.753, Multiword + 8388608, 3.186, 2.884,, 2.884, Multiword + 16777216, 3.214, 2.901,, 2.901, Multiword + 33554432, 3.213, 2.909,, 2.909, Multiword + 67108864, 3.214, 2.907,, 2.907, Multiword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 64, 8, 8, 8, 4, 0, 33368, 121356 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 7.388, 10.170, 10.184, 10.877, 10.857, 10.789, 10.439,, 10.170, Byte + 8, 2.948, 8.160, 8.290, 7.980, 8.238, 8.501, 8.716,, 7.980, ByteWord + 16, 1.500, 7.933, 7.910, 7.360, 7.219, 7.048, 5.126,, 5.126, Multiword + 32, 0.844, 7.729, 7.566, 7.001, 5.133, 6.594, 3.719,, 3.719, Multiword + 64, 0.547, 6.504, 7.469, 6.648, 4.699, 6.318, 2.438,, 2.438, Multiword + 128, 0.399, 7.594, 7.470, 6.512, 4.622, 6.130, 1.829,, 1.829, Multiword + 256, 0.325, 7.578, 7.445, 6.361, 4.520, 6.032, 1.508,, 1.508, Multiword + 512, 0.288, 7.601, 7.460, 6.378, 4.434, 6.042, 1.391,, 1.391, Multiword + 1024, 0.269, 7.516, 7.450, 6.363, 4.435, 6.091, 1.316,, 1.316, Multiword + 2048, 0.260, 7.426, 7.440, 6.347, 4.444, 6.129, 1.282,, 1.282, Multiword + 4096, 0.259, 7.434, 7.415, 6.363, 4.436, 6.073, 1.270,, 1.270, Multiword + 8192, 0.255, 7.419, 7.410, 6.359, 4.433, 6.046, 1.270,, 1.270, Multiword + 16384, 0.253, 7.362, 7.419, 6.332, 4.432, 6.053, 1.280,, 1.280, Multiword + 32768, 0.260, 7.401, 7.341, 6.337, 4.432, 6.078, 1.287,, 1.287, Multiword + 65536, 0.302, 7.407, 7.489, 6.347, 4.434, 6.853, 1.288,, 1.288, Multiword + 131072, 0.302, 7.406, 7.332, 6.335, 4.436, 6.823, 1.287,, 1.287, Multiword + 262144, 0.302, 7.456, 7.518, 6.346, 4.443, 6.810, 1.287,, 1.287, Multiword + 524288, 0.301, 7.492, 7.545, 6.393, 4.482, 6.847, 1.287,, 1.287, Multiword + 1048576, 0.302, 7.487, 7.556, 6.420, 4.488, 6.914, 1.288,, 1.288, Multiword + 2097152, 0.304, 7.519, 7.545, 6.431, 4.502, 6.932, 1.301,, 1.301, Multiword + 4194304, 0.304, 7.521, 7.580, 6.453, 4.520, 6.940, 1.302,, 1.302, Multiword + 8388608, 0.546, 7.754, 7.808, 6.638, 4.687, 7.102, 1.406,, 1.406, Multiword + 16777216, 0.555, 7.754, 7.809, 6.586, 4.695, 7.119, 1.409,, 1.409, Multiword + 33554432, 0.556, 7.739, 7.787, 6.666, 4.700, 7.120, 1.414,, 1.414, Multiword + 67108864, 0.561, 7.760, 7.817, 6.657, 4.657, 7.129, 1.416,, 1.416, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 64, 8, 8, 8, 3, 0, 33368, 130167 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 10.593, 10.796,, 10.593, Blockword + 8, 6.215, 8.126,, 6.215, Blockword + 16, 4.860, 7.201,, 4.860, Blockword + 32, 4.153, 6.593,, 4.153, Blockword + 64, 3.703, 7.501,, 3.703, Blockword + 128, 3.642, 8.064,, 3.642, Blockword + 256, 3.535, 8.221,, 3.535, Blockword + 512, 3.495, 8.374,, 3.495, Blockword + 1024, 3.487, 8.380,, 3.487, Blockword + 2048, 3.490, 8.421,, 3.490, Blockword + 4096, 3.474, 8.435,, 3.474, Blockword + 8192, 3.470, 8.453,, 3.470, Blockword + 16384, 3.466, 8.467,, 3.466, Blockword + 32768, 3.469, 8.476,, 3.469, Blockword + 65536, 5.142, 8.476,, 5.142, Blockword + 131072, 5.107, 8.474,, 5.107, Blockword + 262144, 5.494, 8.531,, 5.494, Blockword + 524288, 5.730, 8.557,, 5.730, Blockword + 1048576, 5.731, 8.566,, 5.731, Blockword + 2097152, 5.800, 8.582,, 5.800, Blockword + 4194304, 5.817, 8.619,, 5.817, Blockword + 8388608, 5.930, 8.842,, 5.930, Blockword + 16777216, 6.030, 8.854,, 6.030, Blockword + 33554432, 6.032, 8.857,, 6.032, Blockword + 67108864, 6.040, 8.854,, 6.040, Blockword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 32, 8, 8, 8, 4, 0, 33368, 955008 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 7.367, 10.289, 10.174, 10.934, 11.626, 10.853, 10.593, 8.819,, 8.819, CRC32C + 8, 2.751, 8.168, 8.280, 8.116, 8.189, 8.501, 8.782, 6.292,, 6.292, CRC32C + 16, 1.491, 7.932, 7.926, 7.360, 7.220, 7.048, 5.126, 3.969,, 3.969, CRC32C + 32, 0.845, 7.729, 7.564, 7.000, 4.983, 6.621, 3.719, 3.282,, 3.282, CRC32C + 64, 0.547, 7.582, 7.493, 6.650, 4.722, 6.387, 2.438, 2.782,, 2.438, Multiword + 128, 0.399, 7.594, 7.469, 6.688, 4.602, 6.157, 1.829, 2.727,, 1.829, Multiword + 256, 0.325, 7.578, 7.439, 6.361, 4.520, 6.145, 1.508, 2.641,, 1.508, Multiword + 512, 0.288, 7.602, 7.461, 6.378, 4.426, 6.081, 1.389, 1.594,, 1.389, Multiword + 1024, 0.269, 7.518, 7.449, 6.379, 4.457, 6.040, 1.316, 1.510,, 1.316, Multiword + 2048, 0.260, 7.431, 7.438, 6.351, 4.440, 6.012, 1.277, 1.477,, 1.277, Multiword + 4096, 0.259, 7.433, 7.429, 6.363, 4.468, 6.050, 1.273, 1.455,, 1.273, Multiword + 8192, 0.255, 7.430, 7.416, 6.360, 4.439, 6.043, 1.264, 1.452,, 1.264, Multiword + 16384, 0.253, 7.379, 7.389, 6.331, 4.442, 6.071, 1.275, 1.455,, 1.275, Multiword + 32768, 0.260, 7.384, 7.340, 6.338, 4.436, 6.084, 1.286, 1.451,, 1.286, Multiword + 65536, 0.302, 7.403, 7.403, 6.339, 4.443, 6.797, 1.288, 1.456,, 1.288, Multiword + 131072, 0.301, 7.401, 7.442, 6.334, 4.444, 6.782, 1.287, 1.459,, 1.287, Multiword + 262144, 0.301, 7.457, 7.518, 6.344, 4.444, 6.777, 1.287, 1.460,, 1.287, Multiword + 524288, 0.301, 7.465, 7.545, 6.391, 4.485, 6.844, 1.287, 1.462,, 1.287, Multiword + 1048576, 0.302, 7.503, 7.552, 6.419, 4.491, 6.896, 1.288, 1.463,, 1.288, Multiword + 2097152, 0.304, 7.508, 7.554, 6.430, 4.496, 6.896, 1.298, 1.475,, 1.298, Multiword + 4194304, 0.305, 7.525, 7.594, 6.460, 4.513, 6.919, 1.306, 1.480,, 1.306, Multiword + 8388608, 0.545, 7.745, 7.704, 6.651, 4.674, 7.081, 1.411, 1.596,, 1.411, Multiword + 16777216, 0.557, 7.752, 7.807, 6.654, 4.688, 7.091, 1.412, 1.573,, 1.412, Multiword + 33554432, 0.560, 7.761, 7.817, 6.663, 4.702, 7.095, 1.413, 1.602,, 1.413, Multiword + 67108864, 0.559, 7.760, 7.816, 6.663, 4.702, 7.105, 1.408, 1.606,, 1.408, Multiword + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 32, 8, 8, 8, 3, 0, 33368, 957186 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 10.628, 10.797, 8.821,, 8.821, CRC32C + 8, 6.279, 8.126, 6.126,, 6.126, CRC32C + 16, 4.860, 7.201, 3.969,, 3.969, CRC32C + 32, 4.168, 6.601, 3.282,, 3.282, CRC32C + 64, 3.689, 7.439, 2.813,, 2.813, CRC32C + 128, 3.634, 8.074, 2.735,, 2.735, CRC32C + 256, 3.559, 8.217, 2.641,, 2.641, CRC32C + 512, 3.489, 8.350, 1.594,, 1.594, CRC32C + 1024, 3.487, 8.381, 1.496,, 1.496, CRC32C + 2048, 3.486, 8.437, 1.489,, 1.489, CRC32C + 4096, 3.470, 8.418, 1.455,, 1.455, CRC32C + 8192, 3.468, 8.449, 1.454,, 1.454, CRC32C + 16384, 3.464, 8.464, 1.458,, 1.458, CRC32C + 32768, 3.468, 8.469, 1.454,, 1.454, CRC32C + 65536, 5.093, 8.473, 1.457,, 1.457, CRC32C + 131072, 5.076, 8.477, 1.459,, 1.459, CRC32C + 262144, 5.464, 8.530, 1.460,, 1.460, CRC32C + 524288, 5.704, 8.565, 1.461,, 1.461, CRC32C + 1048576, 5.725, 8.571, 1.463,, 1.463, CRC32C + 2097152, 5.778, 8.590, 1.475,, 1.475, CRC32C + 4194304, 5.786, 8.615, 1.480,, 1.480, CRC32C + 8388608, 5.975, 8.835, 1.593,, 1.593, CRC32C + 16777216, 6.001, 8.839, 1.600,, 1.600, CRC32C + 33554432, 6.005, 8.845, 1.605,, 1.605, CRC32C + 67108864, 6.007, 8.861, 1.606,, 1.606, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 32, 4, 4, 4, 4, 0, 8500, 917064 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 4.459, 6.636, 6.665, 6.676, 6.376, 6.127, 6.252, 7.564,, 6.127, Blockword + 8, 2.626, 5.677, 5.817, 4.663, 3.892, 3.993, 3.752, 5.251,, 3.752, Multiword + 16, 1.243, 5.501, 5.928, 4.940, 3.071, 3.063, 3.038, 3.691,, 3.038, Multiword + 32, 0.719, 6.193, 6.170, 5.239, 2.750, 2.810, 3.470, 3.146,, 2.750, Word + 64, 0.485, 6.380, 6.335, 5.427, 2.651, 2.718, 3.359, 2.762,, 2.651, Word + 128, 0.368, 6.774, 6.360, 5.520, 2.591, 2.656, 3.300, 2.717,, 2.591, Word + 256, 0.309, 6.664, 6.342, 5.566, 2.547, 2.597, 3.262, 2.637,, 2.547, Word + 512, 0.280, 6.687, 6.504, 5.561, 2.561, 2.764, 3.240, 1.559,, 1.559, CRC32C + 1024, 0.265, 6.650, 6.469, 5.614, 2.541, 2.741, 3.232, 1.520,, 1.520, CRC32C + 2048, 0.269, 6.635, 6.385, 5.696, 2.534, 2.728, 3.219, 1.502,, 1.502, CRC32C + 4096, 0.259, 6.619, 6.438, 5.697, 2.525, 2.715, 3.229, 1.455,, 1.455, CRC32C + 8192, 0.255, 6.585, 6.429, 5.689, 2.519, 2.709, 3.230, 1.454,, 1.454, CRC32C + 16384, 0.253, 6.411, 6.149, 5.565, 2.491, 2.703, 3.237, 1.455,, 1.455, CRC32C + 32768, 0.261, 6.437, 6.178, 5.580, 2.486, 2.703, 3.251, 1.456,, 1.456, CRC32C + 65536, 0.308, 6.477, 6.251, 5.583, 2.486, 2.698, 3.252, 1.456,, 1.456, CRC32C + 131072, 0.307, 6.469, 6.251, 5.585, 2.485, 2.692, 3.254, 1.459,, 1.459, CRC32C + 262144, 0.308, 6.471, 6.289, 5.658, 2.485, 2.688, 3.251, 1.460,, 1.460, CRC32C + 524288, 0.307, 6.574, 6.299, 5.705, 2.493, 2.688, 3.256, 1.461,, 1.461, CRC32C + 1048576, 0.309, 6.622, 6.353, 5.709, 2.517, 2.708, 3.279, 1.463,, 1.463, CRC32C + 2097152, 0.311, 6.657, 6.346, 5.731, 2.532, 2.720, 3.292, 1.475,, 1.475, CRC32C + 4194304, 0.312, 6.680, 6.469, 5.762, 2.588, 2.741, 3.333, 1.487,, 1.487, CRC32C + 8388608, 0.547, 6.874, 6.652, 5.954, 2.682, 2.827, 3.383, 1.566,, 1.566, CRC32C + 16777216, 0.553, 6.880, 6.664, 5.891, 2.688, 2.868, 3.449, 1.603,, 1.603, CRC32C + 33554432, 0.552, 6.875, 6.699, 5.970, 2.708, 2.861, 3.466, 1.595,, 1.595, CRC32C + 67108864, 0.580, 6.847, 6.657, 5.943, 2.699, 2.862, 3.449, 1.608,, 1.608, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 32, 32, 4, 4, 4, 3, 0, 8500, 917523 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.253, 6.502, 7.563,, 6.253, Blockword + 8, 3.969, 4.050, 5.251,, 3.969, Blockword + 16, 3.054, 3.065, 3.691,, 3.054, Blockword + 32, 2.752, 3.206, 3.146,, 2.752, Blockword + 64, 2.714, 3.033, 2.762,, 2.714, Blockword + 128, 2.670, 2.907, 2.717,, 2.670, Blockword + 256, 2.624, 2.873, 2.637,, 2.624, Blockword + 512, 2.762, 2.844, 1.559,, 1.559, CRC32C + 1024, 2.739, 2.852, 1.493,, 1.493, CRC32C + 2048, 2.718, 2.838, 1.485,, 1.485, CRC32C + 4096, 2.711, 2.828, 1.456,, 1.456, CRC32C + 8192, 2.706, 2.828, 1.455,, 1.455, CRC32C + 16384, 2.704, 2.828, 1.455,, 1.455, CRC32C + 32768, 2.703, 2.852, 1.455,, 1.455, CRC32C + 65536, 2.405, 2.857, 1.456,, 1.456, CRC32C + 131072, 2.397, 2.860, 1.459,, 1.459, CRC32C + 262144, 2.316, 2.861, 1.460,, 1.460, CRC32C + 524288, 2.276, 2.864, 1.462,, 1.462, CRC32C + 1048576, 2.288, 2.885, 1.462,, 1.462, CRC32C + 2097152, 2.291, 2.898, 1.475,, 1.475, CRC32C + 4194304, 2.304, 2.912, 1.480,, 1.480, CRC32C + 8388608, 2.416, 3.002, 1.583,, 1.583, CRC32C + 16777216, 2.402, 3.054, 1.610,, 1.610, CRC32C + 33554432, 2.425, 3.054, 1.603,, 1.603, CRC32C + 67108864, 2.427, 3.052, 1.611,, 1.611, CRC32C + diff --git a/crcutil-1.0/doc/data/test-cl-64-1.csv b/crcutil-1.0/doc/data/test-cl-64-1.csv new file mode 100644 index 0000000..c2a03cf --- /dev/null +++ b/crcutil-1.0/doc/data/test-cl-64-1.csv @@ -0,0 +1,310 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 128, 16, 16, 8, 4, 0, 66736, 991683 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 8.251, 11.910, 11.655, 12.222, 12.535, 16.253, 12.803,, 11.655, ByteUnrolled + 8, 5.126, 10.787, 10.758, 10.251, 6.501, 6.876, 7.001,, 6.501, Word + 16, 3.625, 11.553, 11.535, 10.407, 4.877, 5.126, 4.875,, 4.875, Multiword + 32, 1.751, 11.867, 11.844, 10.782, 4.212, 4.428, 4.339,, 4.212, Word + 64, 1.297, 12.134, 12.094, 11.010, 4.018, 4.071, 3.285,, 3.285, Multiword + 128, 1.071, 12.602, 12.172, 11.143, 3.824, 3.945, 2.748,, 2.748, Multiword + 256, 0.958, 12.492, 12.188, 11.205, 3.786, 3.865, 2.453,, 2.453, Multiword + 512, 0.901, 12.419, 12.323, 11.198, 3.892, 3.881, 2.363,, 2.363, Multiword + 1024, 0.873, 12.377, 12.276, 11.248, 4.065, 4.093, 2.340,, 2.340, Multiword + 2048, 0.858, 12.355, 12.252, 11.257, 4.105, 4.204, 2.322,, 2.322, Multiword + 4096, 0.857, 12.339, 12.240, 11.261, 4.080, 4.121, 2.286,, 2.286, Multiword + 8192, 0.850, 12.327, 12.226, 11.269, 4.100, 4.157, 2.272,, 2.272, Multiword + 16384, 0.847, 12.281, 12.222, 11.258, 4.151, 4.209, 2.265,, 2.265, Multiword + 32768, 0.846, 12.233, 12.221, 11.266, 4.151, 4.166, 2.258,, 2.258, Multiword + 65536, 0.845, 12.198, 12.223, 11.266, 4.138, 3.116, 2.255,, 2.255, Multiword + 131072, 0.845, 12.104, 12.224, 11.270, 4.190, 2.928, 2.254,, 2.254, Multiword + 262144, 0.844, 12.271, 12.315, 11.311, 4.196, 2.820, 2.245,, 2.245, Multiword + 524288, 0.844, 12.364, 12.338, 11.391, 4.186, 2.774, 2.255,, 2.255, Multiword + 1048576, 0.844, 12.469, 12.371, 11.403, 4.249, 2.673, 2.281,, 2.281, Multiword + 2097152, 0.845, 12.478, 12.389, 11.415, 4.267, 2.678, 2.284,, 2.284, Multiword + 4194304, 0.851, 12.508, 12.410, 11.442, 4.273, 2.671, 2.292,, 2.292, Multiword + 8388608, 0.950, 12.742, 12.652, 11.677, 4.413, 2.777, 2.383,, 2.383, Multiword + 16777216, 0.950, 12.756, 12.680, 11.694, 4.415, 2.793, 2.407,, 2.407, Multiword + 33554432, 0.950, 12.776, 12.668, 11.703, 4.431, 2.791, 2.418,, 2.418, Multiword + 67108864, 0.951, 12.775, 12.689, 11.702, 4.432, 2.796, 2.402,, 2.402, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 128, 16, 16, 8, 3, 0, 66736, 957753 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 13.885, 12.628,, 12.628, Multiword + 8, 7.001, 6.501,, 6.501, Multiword + 16, 5.098, 4.777,, 4.777, Multiword + 32, 4.415, 4.331,, 4.331, Multiword + 64, 4.109, 3.652,, 3.652, Multiword + 128, 3.938, 2.892,, 2.892, Multiword + 256, 3.785, 2.633,, 2.633, Multiword + 512, 3.878, 2.527,, 2.527, Multiword + 1024, 4.110, 2.605,, 2.605, Multiword + 2048, 4.199, 2.535,, 2.535, Multiword + 4096, 4.132, 2.495,, 2.495, Multiword + 8192, 4.150, 2.462,, 2.462, Multiword + 16384, 4.184, 2.459,, 2.459, Multiword + 32768, 4.191, 2.455,, 2.455, Multiword + 65536, 3.608, 2.448,, 2.448, Multiword + 131072, 3.375, 2.445,, 2.445, Multiword + 262144, 3.035, 2.450,, 2.450, Multiword + 524288, 2.863, 2.449,, 2.449, Multiword + 1048576, 2.855, 2.474,, 2.474, Multiword + 2097152, 2.824, 2.477,, 2.477, Multiword + 4194304, 2.820, 2.484,, 2.484, Multiword + 8388608, 2.935, 2.605,, 2.605, Multiword + 16777216, 2.934, 2.616,, 2.616, Multiword + 33554432, 2.939, 2.619,, 2.619, Multiword + 67108864, 2.937, 2.626,, 2.626, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 128, 16, 16, 4, 4, 0, 33968, 912312 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 8.001, 11.924, 11.666, 12.207, 10.251, 11.252, 10.251,, 10.251, Word + 8, 5.001, 10.779, 10.657, 10.251, 6.922, 7.376, 7.104,, 6.922, Word + 16, 2.750, 11.553, 11.438, 10.407, 5.915, 6.070, 5.918,, 5.915, Word + 32, 1.813, 11.893, 11.844, 10.782, 5.412, 5.446, 4.251,, 4.251, Multiword + 64, 1.360, 12.134, 12.079, 11.010, 5.195, 5.135, 3.319,, 3.319, Multiword + 128, 1.133, 12.602, 12.172, 11.143, 5.051, 4.989, 2.836,, 2.836, Multiword + 256, 1.020, 12.492, 12.188, 11.205, 4.976, 4.895, 2.606,, 2.606, Multiword + 512, 0.964, 12.419, 12.323, 11.198, 4.955, 4.919, 2.478,, 2.478, Multiword + 1024, 0.935, 12.377, 12.276, 11.248, 4.949, 4.861, 2.414,, 2.414, Multiword + 2048, 0.931, 12.354, 12.253, 11.257, 4.949, 4.833, 2.388,, 2.388, Multiword + 4096, 0.919, 12.341, 12.240, 11.261, 4.930, 4.817, 2.369,, 2.369, Multiword + 8192, 0.913, 12.327, 12.226, 11.269, 4.925, 4.808, 2.364,, 2.364, Multiword + 16384, 0.910, 12.251, 12.223, 11.259, 4.920, 4.808, 2.364,, 2.364, Multiword + 32768, 0.909, 12.124, 12.223, 11.266, 4.928, 4.806, 2.360,, 2.360, Multiword + 65536, 0.908, 12.198, 12.225, 11.265, 4.928, 3.254, 2.359,, 2.359, Multiword + 131072, 0.907, 12.219, 12.228, 11.270, 4.927, 3.062, 2.358,, 2.358, Multiword + 262144, 0.907, 12.305, 12.314, 11.355, 4.929, 2.962, 2.359,, 2.359, Multiword + 524288, 0.906, 12.419, 12.343, 11.387, 4.968, 2.913, 2.359,, 2.359, Multiword + 1048576, 0.907, 12.446, 12.360, 11.402, 4.976, 2.787, 2.383,, 2.383, Multiword + 2097152, 0.918, 12.482, 12.388, 11.415, 4.990, 2.779, 2.384,, 2.384, Multiword + 4194304, 0.918, 12.495, 12.405, 11.443, 5.000, 2.779, 2.395,, 2.395, Multiword + 8388608, 1.018, 12.745, 12.625, 11.681, 5.172, 2.903, 2.504,, 2.504, Multiword + 16777216, 1.015, 12.757, 12.643, 11.689, 5.191, 2.914, 2.521,, 2.521, Multiword + 33554432, 1.017, 12.763, 12.688, 11.677, 5.193, 2.911, 2.525,, 2.525, Multiword + 67108864, 1.018, 12.777, 12.689, 11.704, 5.201, 2.911, 2.530,, 2.530, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 128, 16, 16, 4, 3, 0, 33968, 899532 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 10.846, 10.102,, 10.102, Multiword + 8, 7.381, 7.031,, 7.031, Multiword + 16, 6.126, 5.963,, 5.963, Multiword + 32, 5.446, 4.662,, 4.662, Multiword + 64, 5.033, 3.495,, 3.495, Multiword + 128, 4.956, 3.144,, 3.144, Multiword + 256, 4.891, 2.844,, 2.844, Multiword + 512, 4.909, 2.753,, 2.753, Multiword + 1024, 4.856, 2.670,, 2.670, Multiword + 2048, 4.832, 2.665,, 2.665, Multiword + 4096, 4.818, 2.643,, 2.643, Multiword + 8192, 4.807, 2.624,, 2.624, Multiword + 16384, 4.807, 2.635,, 2.635, Multiword + 32768, 4.807, 2.636,, 2.636, Multiword + 65536, 3.886, 2.638,, 2.638, Multiword + 131072, 3.684, 2.637,, 2.637, Multiword + 262144, 3.267, 2.638,, 2.638, Multiword + 524288, 3.037, 2.638,, 2.638, Multiword + 1048576, 3.034, 2.662,, 2.662, Multiword + 2097152, 2.992, 2.672,, 2.672, Multiword + 4194304, 2.986, 2.675,, 2.675, Multiword + 8388608, 3.110, 2.799,, 2.799, Multiword + 16777216, 3.116, 2.813,, 2.813, Multiword + 33554432, 3.116, 2.815,, 2.815, Multiword + 67108864, 3.113, 2.817,, 2.817, Multiword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 64, 8, 8, 8, 4, 0, 33384, 82494 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.250, 6.127, 6.308, 7.501, 7.327, 7.802, 7.501,, 6.127, Byte + 8, 2.000, 6.044, 5.879, 5.027, 3.007, 3.376, 2.949,, 2.949, Multiword + 16, 1.125, 6.426, 6.225, 5.129, 2.708, 2.613, 2.491,, 2.491, Multiword + 32, 0.625, 6.764, 6.465, 5.378, 2.370, 2.365, 2.289,, 2.289, Multiword + 64, 0.392, 6.867, 6.574, 5.438, 2.257, 2.228, 1.741,, 1.741, Multiword + 128, 0.308, 7.207, 6.613, 5.417, 2.134, 2.188, 1.425,, 1.425, Multiword + 256, 0.281, 7.119, 6.618, 5.455, 2.110, 2.153, 1.290,, 1.290, Multiword + 512, 0.266, 7.099, 6.733, 5.454, 2.074, 2.136, 1.218,, 1.218, Multiword + 1024, 0.257, 7.047, 6.703, 5.470, 2.070, 2.150, 1.180,, 1.180, Multiword + 2048, 0.254, 7.027, 6.690, 5.464, 2.082, 2.153, 1.162,, 1.162, Multiword + 4096, 0.257, 7.011, 6.679, 5.493, 2.093, 2.141, 1.157,, 1.157, Multiword + 8192, 0.253, 7.006, 6.672, 5.482, 2.078, 2.133, 1.157,, 1.157, Multiword + 16384, 0.252, 7.000, 6.669, 5.465, 2.080, 2.130, 1.163,, 1.163, Multiword + 32768, 0.259, 6.998, 6.662, 5.464, 2.078, 2.130, 1.180,, 1.180, Multiword + 65536, 0.302, 6.983, 6.658, 5.463, 2.082, 1.620, 1.182,, 1.182, Multiword + 131072, 0.302, 6.992, 6.651, 5.463, 2.084, 1.594, 1.180,, 1.180, Multiword + 262144, 0.302, 7.020, 6.660, 5.464, 2.082, 1.582, 1.182,, 1.182, Multiword + 524288, 0.301, 7.034, 6.717, 5.507, 2.084, 1.576, 1.181,, 1.181, Multiword + 1048576, 0.302, 7.053, 6.742, 5.531, 2.098, 1.540, 1.182,, 1.182, Multiword + 2097152, 0.304, 7.075, 6.760, 5.543, 2.106, 1.553, 1.196,, 1.196, Multiword + 4194304, 0.304, 7.111, 6.774, 5.561, 2.108, 1.559, 1.196,, 1.196, Multiword + 8388608, 0.543, 7.299, 6.952, 5.745, 2.239, 1.664, 1.300,, 1.300, Multiword + 16777216, 0.557, 7.331, 6.952, 5.760, 2.247, 1.673, 1.297,, 1.297, Multiword + 33554432, 0.558, 7.322, 6.962, 5.763, 2.247, 1.681, 1.304,, 1.304, Multiword + 67108864, 0.562, 7.328, 6.971, 5.768, 2.252, 1.678, 1.305,, 1.305, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 64, 8, 8, 8, 3, 0, 33384, 88803 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 7.785, 7.501,, 7.501, Multiword + 8, 3.435, 3.164,, 3.164, Multiword + 16, 2.664, 2.577,, 2.577, Multiword + 32, 2.367, 2.314,, 2.314, Multiword + 64, 2.265, 1.860,, 1.860, Multiword + 128, 2.186, 1.493,, 1.493, Multiword + 256, 2.138, 1.376,, 1.376, Multiword + 512, 2.149, 1.280,, 1.280, Multiword + 1024, 2.143, 1.250,, 1.250, Multiword + 2048, 2.134, 1.236,, 1.236, Multiword + 4096, 2.129, 1.225,, 1.225, Multiword + 8192, 2.129, 1.222,, 1.222, Multiword + 16384, 2.130, 1.231,, 1.231, Multiword + 32768, 2.130, 1.230,, 1.230, Multiword + 65536, 1.589, 1.232,, 1.232, Multiword + 131072, 1.565, 1.230,, 1.230, Multiword + 262144, 1.409, 1.230,, 1.230, Multiword + 524288, 1.330, 1.230,, 1.230, Multiword + 1048576, 1.327, 1.231,, 1.231, Multiword + 2097152, 1.320, 1.244,, 1.244, Multiword + 4194304, 1.320, 1.244,, 1.244, Multiword + 8388608, 1.425, 1.361,, 1.361, Multiword + 16777216, 1.429, 1.369,, 1.369, Multiword + 33554432, 1.431, 1.371,, 1.371, Multiword + 67108864, 1.435, 1.373,, 1.373, Multiword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 32, 8, 8, 8, 4, 0, 33384, 1106208 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.250, 6.208, 6.313, 7.501, 7.331, 7.802, 7.501, 7.251,, 6.208, Byte + 8, 2.000, 6.044, 5.884, 5.027, 3.001, 3.376, 2.955, 3.250,, 2.955, Multiword + 16, 1.125, 6.428, 6.225, 5.126, 2.514, 2.613, 2.500, 2.527,, 2.500, Multiword + 32, 0.625, 6.762, 6.466, 5.377, 2.250, 2.365, 2.303, 2.241,, 2.241, CRC32C + 64, 0.399, 6.868, 6.590, 5.438, 2.153, 2.228, 1.739, 2.150,, 1.739, Multiword + 128, 0.308, 7.207, 6.606, 5.447, 2.083, 2.186, 1.425, 2.126,, 1.425, Multiword + 256, 0.281, 7.119, 6.620, 5.456, 2.099, 2.153, 1.287, 2.097,, 1.287, Multiword + 512, 0.266, 7.099, 6.733, 5.454, 2.084, 2.141, 1.216, 1.446,, 1.216, Multiword + 1024, 0.257, 7.047, 6.703, 5.471, 2.086, 2.158, 1.180, 1.417,, 1.180, Multiword + 2048, 0.254, 7.027, 6.690, 5.463, 2.075, 2.159, 1.161, 1.400,, 1.161, Multiword + 4096, 0.257, 7.011, 6.679, 5.494, 2.092, 2.137, 1.157, 1.380,, 1.157, Multiword + 8192, 0.253, 7.006, 6.673, 5.484, 2.078, 2.136, 1.156, 1.379,, 1.156, Multiword + 16384, 0.252, 7.002, 6.669, 5.471, 2.079, 2.130, 1.163, 1.389,, 1.163, Multiword + 32768, 0.259, 6.994, 6.662, 5.463, 2.081, 2.130, 1.181, 1.381,, 1.181, Multiword + 65536, 0.302, 6.982, 6.655, 5.463, 2.083, 1.569, 1.182, 1.385,, 1.182, Multiword + 131072, 0.302, 6.976, 6.656, 5.463, 2.082, 1.559, 1.181, 1.385,, 1.181, Multiword + 262144, 0.301, 7.009, 6.658, 5.465, 2.083, 1.557, 1.181, 1.386,, 1.181, Multiword + 524288, 0.301, 7.044, 6.717, 5.508, 2.082, 1.555, 1.181, 1.386,, 1.181, Multiword + 1048576, 0.302, 7.049, 6.742, 5.532, 2.104, 1.521, 1.182, 1.388,, 1.182, Multiword + 2097152, 0.304, 7.079, 6.754, 5.544, 2.106, 1.534, 1.196, 1.400,, 1.196, Multiword + 4194304, 0.304, 7.111, 6.774, 5.558, 2.107, 1.539, 1.196, 1.406,, 1.196, Multiword + 8388608, 0.547, 7.303, 6.941, 5.748, 2.226, 1.646, 1.296, 1.523,, 1.296, Multiword + 16777216, 0.561, 7.320, 6.965, 5.756, 2.245, 1.645, 1.297, 1.516,, 1.297, Multiword + 33554432, 0.561, 7.318, 6.969, 5.724, 2.251, 1.660, 1.300, 1.531,, 1.300, Multiword + 67108864, 0.560, 7.332, 6.969, 5.756, 2.254, 1.662, 1.303, 1.532,, 1.303, Multiword + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 32, 8, 8, 8, 3, 0, 33384, 1106505 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 7.918, 7.501, 7.251,, 7.251, CRC32C + 8, 3.421, 3.155, 3.250,, 3.155, Multiword + 16, 2.673, 2.576, 2.527,, 2.527, CRC32C + 32, 2.332, 2.315, 2.240,, 2.240, CRC32C + 64, 2.261, 1.860, 2.143,, 1.860, Multiword + 128, 2.180, 1.483, 2.126,, 1.483, Multiword + 256, 2.139, 1.379, 2.097,, 1.379, Multiword + 512, 2.149, 1.279, 1.450,, 1.279, Multiword + 1024, 2.151, 1.252, 1.409,, 1.252, Multiword + 2048, 2.134, 1.235, 1.408,, 1.235, Multiword + 4096, 2.132, 1.226, 1.379,, 1.226, Multiword + 8192, 2.131, 1.224, 1.381,, 1.224, Multiword + 16384, 2.129, 1.227, 1.390,, 1.227, Multiword + 32768, 2.129, 1.231, 1.381,, 1.231, Multiword + 65536, 1.551, 1.231, 1.383,, 1.231, Multiword + 131072, 1.541, 1.230, 1.384,, 1.230, Multiword + 262144, 1.388, 1.230, 1.384,, 1.230, Multiword + 524288, 1.311, 1.230, 1.386,, 1.230, Multiword + 1048576, 1.310, 1.231, 1.388,, 1.231, Multiword + 2097152, 1.304, 1.244, 1.400,, 1.244, Multiword + 4194304, 1.309, 1.247, 1.406,, 1.247, Multiword + 8388608, 1.406, 1.363, 1.525,, 1.363, Multiword + 16777216, 1.417, 1.365, 1.528,, 1.365, Multiword + 33554432, 1.412, 1.369, 1.530,, 1.369, Multiword + 67108864, 1.418, 1.369, 1.532,, 1.369, Multiword + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 32, 4, 4, 4, 4, 0, 8528, 1093401 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 4.000, 6.340, 6.307, 5.876, 5.501, 6.251, 5.501, 7.252,, 5.501, Word + 8, 2.250, 6.046, 5.884, 5.024, 3.418, 3.647, 3.375, 3.043,, 3.043, CRC32C + 16, 1.000, 6.431, 6.225, 5.361, 2.771, 3.044, 2.885, 2.528,, 2.528, CRC32C + 32, 0.594, 6.752, 6.475, 5.505, 2.672, 2.865, 2.095, 2.235,, 2.095, Multiword + 64, 0.406, 6.868, 6.568, 5.586, 2.651, 2.797, 1.715, 2.147,, 1.715, Multiword + 128, 0.317, 7.207, 6.606, 5.613, 2.625, 2.759, 1.477, 2.126,, 1.477, Multiword + 256, 0.282, 7.119, 6.618, 5.622, 2.609, 2.755, 1.376, 2.097,, 1.376, Multiword + 512, 0.266, 7.098, 6.742, 5.613, 2.608, 2.801, 1.327, 1.451,, 1.327, Multiword + 1024, 0.258, 7.047, 6.706, 5.618, 2.613, 2.759, 1.301, 1.418,, 1.301, Multiword + 2048, 0.264, 7.027, 6.684, 5.640, 2.628, 2.759, 1.295, 1.404,, 1.295, Multiword + 4096, 0.256, 7.011, 6.677, 5.627, 2.621, 2.752, 1.284, 1.379,, 1.284, Multiword + 8192, 0.253, 7.006, 6.668, 5.623, 2.616, 2.759, 1.280, 1.380,, 1.280, Multiword + 16384, 0.252, 7.001, 6.666, 5.621, 2.614, 2.755, 1.282, 1.389,, 1.282, Multiword + 32768, 0.260, 6.995, 6.668, 5.619, 2.614, 2.754, 1.299, 1.381,, 1.299, Multiword + 65536, 0.308, 6.987, 6.655, 5.618, 2.613, 1.498, 1.301, 1.384,, 1.301, Multiword + 131072, 0.308, 6.983, 6.647, 5.619, 2.613, 1.489, 1.302, 1.385,, 1.302, Multiword + 262144, 0.308, 7.018, 6.663, 5.620, 2.613, 1.491, 1.303, 1.385,, 1.303, Multiword + 524288, 0.309, 7.075, 6.716, 5.641, 2.613, 1.488, 1.303, 1.386,, 1.303, Multiword + 1048576, 0.309, 7.091, 6.744, 5.675, 2.635, 1.409, 1.304, 1.388,, 1.304, Multiword + 2097152, 0.312, 7.101, 6.756, 5.685, 2.636, 1.421, 1.317, 1.400,, 1.317, Multiword + 4194304, 0.312, 7.114, 6.769, 5.702, 2.650, 1.426, 1.321, 1.406,, 1.321, Multiword + 8388608, 0.545, 7.315, 6.952, 5.878, 2.774, 1.524, 1.425, 1.520,, 1.425, Multiword + 16777216, 0.556, 7.327, 6.952, 5.813, 2.774, 1.530, 1.427, 1.526,, 1.427, Multiword + 33554432, 0.557, 7.327, 6.853, 5.884, 2.757, 1.516, 1.426, 1.531,, 1.426, Multiword + 67108864, 0.556, 7.316, 6.951, 5.883, 2.776, 1.538, 1.428, 1.529,, 1.428, Multiword + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles +CL-150030729, 64, 32, 4, 4, 4, 3, 0, 8528, 1094247 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.251, 5.501, 7.251,, 5.501, Multiword + 8, 3.643, 3.397, 3.064,, 3.064, CRC32C + 16, 2.977, 2.935, 2.527,, 2.527, CRC32C + 32, 2.825, 2.310, 2.250,, 2.250, CRC32C + 64, 2.797, 1.758, 2.141,, 1.758, Multiword + 128, 2.758, 1.587, 2.126,, 1.587, Multiword + 256, 2.752, 1.455, 2.097,, 1.455, Multiword + 512, 2.785, 1.405, 1.454,, 1.405, Multiword + 1024, 2.752, 1.385, 1.413,, 1.385, Multiword + 2048, 2.754, 1.379, 1.400,, 1.379, Multiword + 4096, 2.754, 1.369, 1.378,, 1.369, Multiword + 8192, 2.756, 1.362, 1.380,, 1.362, Multiword + 16384, 2.752, 1.361, 1.389,, 1.361, Multiword + 32768, 2.755, 1.372, 1.382,, 1.372, Multiword + 65536, 1.929, 1.376, 1.384,, 1.376, Multiword + 131072, 1.920, 1.377, 1.385,, 1.377, Multiword + 262144, 1.711, 1.377, 1.385,, 1.377, Multiword + 524288, 1.599, 1.377, 1.387,, 1.377, Multiword + 1048576, 1.599, 1.379, 1.387,, 1.379, Multiword + 2097152, 1.587, 1.387, 1.400,, 1.387, Multiword + 4194304, 1.592, 1.397, 1.409,, 1.397, Multiword + 8388608, 1.688, 1.497, 1.523,, 1.497, Multiword + 16777216, 1.694, 1.502, 1.501,, 1.501, CRC32C + 33554432, 1.696, 1.505, 1.532,, 1.505, Multiword + 67108864, 1.683, 1.490, 1.529,, 1.490, Multiword + diff --git a/crcutil-1.0/doc/data/test-gcc-32-1.csv b/crcutil-1.0/doc/data/test-gcc-32-1.csv new file mode 100644 index 0000000..fb0e053 --- /dev/null +++ b/crcutil-1.0/doc/data/test-gcc-32-1.csv @@ -0,0 +1,310 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 8, 4, 0, 66720, 1420551 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 9.001, 14.602, 15.273, 15.549, 16.727, 15.716, 15.223,, 14.602, Byte + 8, 4.251, 12.393, 12.361, 12.410, 7.875, 7.542, 7.177,, 7.177, Multiword + 16, 2.375, 12.368, 12.297, 11.396, 6.092, 5.610, 5.489,, 5.489, Multiword + 32, 1.626, 12.380, 12.284, 11.282, 5.194, 4.726, 4.688,, 4.688, Multiword + 64, 1.188, 12.429, 12.302, 11.735, 4.724, 4.255, 4.835,, 4.255, Blockword + 128, 1.032, 12.828, 12.364, 11.560, 4.342, 4.035, 4.594,, 4.035, Blockword + 256, 0.954, 12.692, 12.373, 11.506, 4.225, 3.932, 4.541,, 3.932, Blockword + 512, 0.914, 12.619, 12.453, 11.477, 4.281, 3.913, 4.628,, 3.913, Blockword + 1024, 0.893, 12.636, 12.550, 11.452, 4.634, 4.190, 4.732,, 4.190, Blockword + 2048, 0.885, 12.590, 12.585, 11.450, 4.678, 4.247, 4.714,, 4.247, Blockword + 4096, 0.885, 12.562, 12.601, 11.442, 4.630, 4.177, 4.658,, 4.177, Blockword + 8192, 0.880, 12.555, 12.517, 11.452, 4.651, 4.192, 4.647,, 4.192, Blockword + 16384, 0.878, 12.494, 12.452, 11.452, 4.729, 4.262, 4.658,, 4.262, Blockword + 32768, 0.876, 12.522, 12.446, 11.453, 4.737, 4.255, 4.645,, 4.255, Blockword + 65536, 0.876, 12.526, 12.440, 11.451, 4.713, 5.458, 4.644,, 4.644, Multiword + 131072, 0.873, 12.521, 12.435, 11.456, 4.747, 5.154, 4.646,, 4.646, Multiword + 262144, 0.875, 12.614, 12.529, 11.549, 4.781, 5.000, 4.642,, 4.642, Multiword + 524288, 0.875, 12.664, 12.589, 11.588, 4.833, 4.967, 4.679,, 4.679, Multiword + 1048576, 0.875, 12.689, 12.629, 11.597, 4.854, 4.967, 4.690,, 4.690, Multiword + 2097152, 0.887, 12.719, 12.690, 11.624, 4.863, 4.965, 4.710,, 4.710, Multiword + 4194304, 0.894, 12.773, 12.763, 11.667, 4.885, 4.984, 4.727,, 4.727, Multiword + 8388608, 0.994, 13.041, 13.033, 11.942, 5.055, 5.143, 4.912,, 4.912, Multiword + 16777216, 0.998, 13.058, 13.042, 11.932, 5.058, 5.143, 4.927,, 4.927, Multiword + 33554432, 0.999, 13.054, 13.003, 11.950, 5.073, 5.138, 4.919,, 4.919, Multiword + 67108864, 1.008, 13.076, 13.051, 11.965, 5.053, 5.140, 4.914,, 4.914, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 8, 3, 0, 66720, 1375020 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 17.491, 15.685,, 15.685, Multiword + 8, 8.001, 7.390,, 7.390, Multiword + 16, 5.907, 5.650,, 5.650, Multiword + 32, 4.936, 4.490,, 4.490, Multiword + 64, 4.357, 5.172,, 4.357, Blockword + 128, 4.048, 4.597,, 4.048, Blockword + 256, 3.969, 4.286,, 3.969, Blockword + 512, 3.956, 4.225,, 3.956, Blockword + 1024, 4.247, 4.363,, 4.247, Blockword + 2048, 4.250, 4.352,, 4.250, Blockword + 4096, 4.139, 4.311,, 4.139, Blockword + 8192, 4.228, 4.287,, 4.228, Blockword + 16384, 4.271, 4.286,, 4.271, Blockword + 32768, 4.237, 4.274,, 4.237, Blockword + 65536, 5.284, 4.261,, 4.261, Multiword + 131072, 4.970, 4.264,, 4.264, Multiword + 262144, 4.914, 4.268,, 4.268, Multiword + 524288, 4.907, 4.295,, 4.295, Multiword + 1048576, 4.884, 4.313,, 4.313, Multiword + 2097152, 4.893, 4.332,, 4.332, Multiword + 4194304, 4.895, 4.346,, 4.346, Multiword + 8388608, 5.052, 4.514,, 4.514, Multiword + 16777216, 5.085, 4.531,, 4.531, Multiword + 33554432, 5.086, 4.527,, 4.527, Multiword + 67108864, 5.086, 4.505,, 4.505, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 4, 4, 0, 33952, 1282032 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 8.335, 14.506, 14.508, 15.689, 9.751, 14.208, 10.675,, 9.751, Word + 8, 4.501, 12.385, 12.269, 12.410, 6.813, 8.169, 7.402,, 6.813, Word + 16, 2.563, 12.367, 12.364, 11.396, 5.438, 6.021, 5.781,, 5.438, Word + 32, 1.500, 12.379, 12.235, 11.282, 4.840, 5.105, 4.250,, 4.250, Multiword + 64, 0.991, 12.423, 12.344, 11.733, 4.470, 4.706, 3.292,, 3.292, Multiword + 128, 0.914, 12.828, 12.411, 11.559, 4.365, 4.454, 2.868,, 2.868, Multiword + 256, 0.795, 12.692, 12.441, 11.506, 4.265, 4.411, 2.643,, 2.643, Multiword + 512, 0.839, 12.729, 12.561, 11.491, 4.219, 4.505, 2.544,, 2.544, Multiword + 1024, 0.831, 12.636, 12.468, 11.466, 4.213, 4.433, 2.471,, 2.471, Multiword + 2048, 0.726, 12.592, 12.422, 11.470, 4.206, 4.387, 2.434,, 2.434, Multiword + 4096, 0.815, 12.568, 12.398, 11.473, 4.193, 4.369, 2.435,, 2.435, Multiword + 8192, 0.709, 12.561, 12.498, 11.443, 4.186, 4.338, 2.432,, 2.432, Multiword + 16384, 0.706, 12.552, 12.454, 11.438, 4.178, 4.355, 2.453,, 2.453, Multiword + 32768, 0.733, 12.541, 12.448, 11.444, 4.174, 4.351, 2.473,, 2.473, Multiword + 65536, 0.711, 12.528, 12.443, 11.449, 4.164, 3.557, 2.476,, 2.476, Multiword + 131072, 0.711, 12.520, 12.448, 11.454, 4.157, 3.254, 2.474,, 2.474, Multiword + 262144, 0.717, 12.612, 12.523, 11.501, 4.182, 3.103, 2.477,, 2.477, Multiword + 524288, 0.709, 12.659, 12.584, 11.578, 4.212, 3.022, 2.478,, 2.478, Multiword + 1048576, 0.717, 12.681, 12.660, 11.603, 4.233, 2.920, 2.504,, 2.504, Multiword + 2097152, 0.764, 12.698, 12.705, 11.614, 4.244, 2.915, 2.505,, 2.505, Multiword + 4194304, 0.789, 12.777, 12.748, 11.674, 4.278, 2.912, 2.514,, 2.514, Multiword + 8388608, 0.888, 13.055, 13.006, 11.949, 4.428, 3.046, 2.652,, 2.652, Multiword + 16777216, 0.906, 13.058, 13.031, 11.945, 4.460, 3.052, 2.664,, 2.664, Multiword + 33554432, 0.914, 13.063, 13.043, 11.953, 4.461, 3.017, 2.661,, 2.661, Multiword + 67108864, 0.923, 13.071, 13.047, 11.956, 4.445, 3.055, 2.668,, 2.668, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 4, 3, 0, 33952, 1273275 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 12.098, 9.876,, 9.876, Multiword + 8, 7.937, 6.827,, 6.827, Multiword + 16, 6.077, 5.441,, 5.441, Multiword + 32, 5.146, 4.157,, 4.157, Multiword + 64, 4.704, 2.992,, 2.992, Multiword + 128, 4.510, 2.587,, 2.587, Multiword + 256, 4.483, 2.315,, 2.315, Multiword + 512, 4.469, 2.210,, 2.210, Multiword + 1024, 4.401, 2.166,, 2.166, Multiword + 2048, 4.375, 2.120,, 2.120, Multiword + 4096, 4.364, 2.096,, 2.096, Multiword + 8192, 4.358, 2.092,, 2.092, Multiword + 16384, 4.336, 2.088,, 2.088, Multiword + 32768, 4.347, 2.093,, 2.093, Multiword + 65536, 3.739, 2.093,, 2.093, Multiword + 131072, 3.435, 2.092,, 2.092, Multiword + 262144, 2.979, 2.092,, 2.092, Multiword + 524288, 2.743, 2.092,, 2.092, Multiword + 1048576, 2.730, 2.117,, 2.117, Multiword + 2097152, 2.683, 2.119,, 2.119, Multiword + 4194304, 2.680, 2.127,, 2.127, Multiword + 8388608, 2.801, 2.257,, 2.257, Multiword + 16777216, 2.796, 2.259,, 2.259, Multiword + 33554432, 2.800, 2.267,, 2.267, Multiword + 67108864, 2.802, 2.262,, 2.262, Multiword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 64, 8, 8, 8, 4, 0, 33376, 149688 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 10.532, 15.753, 18.663, 17.473, 17.825, 21.770, 14.752,, 14.752, Multiword + 8, 3.179, 12.451, 15.771, 15.191, 9.626, 11.017, 8.126,, 8.126, Multiword + 16, 1.825, 10.685, 14.914, 13.574, 7.504, 8.612, 5.275,, 5.275, Multiword + 32, 1.485, 9.881, 14.202, 12.751, 6.667, 7.386, 3.732,, 3.732, Multiword + 64, 0.886, 9.280, 13.863, 12.298, 6.172, 6.817, 2.366,, 2.366, Multiword + 128, 0.599, 9.360, 13.738, 12.100, 5.833, 6.574, 1.809,, 1.809, Multiword + 256, 0.455, 9.145, 13.656, 12.039, 5.713, 6.460, 1.551,, 1.551, Multiword + 512, 0.385, 9.075, 13.641, 11.956, 5.730, 6.388, 1.407,, 1.407, Multiword + 1024, 0.372, 9.045, 13.672, 11.940, 5.718, 6.366, 1.339,, 1.339, Multiword + 2048, 0.341, 9.036, 13.618, 11.926, 5.676, 6.298, 1.300,, 1.300, Multiword + 4096, 0.333, 9.014, 13.590, 11.919, 5.692, 6.316, 1.288,, 1.288, Multiword + 8192, 0.325, 9.011, 13.585, 11.915, 5.690, 6.323, 1.283,, 1.283, Multiword + 16384, 0.322, 9.015, 13.584, 11.912, 5.706, 6.338, 1.292,, 1.292, Multiword + 32768, 0.328, 9.047, 13.581, 11.917, 5.720, 6.360, 1.304,, 1.304, Multiword + 65536, 0.358, 9.069, 13.584, 11.916, 5.723, 8.064, 1.304,, 1.304, Multiword + 131072, 0.358, 9.077, 13.594, 11.920, 5.726, 8.039, 1.302,, 1.302, Multiword + 262144, 0.357, 9.151, 13.695, 11.978, 5.731, 8.113, 1.302,, 1.302, Multiword + 524288, 0.357, 9.174, 13.744, 12.019, 5.766, 8.120, 1.302,, 1.302, Multiword + 1048576, 0.358, 9.189, 13.761, 12.057, 5.801, 8.239, 1.303,, 1.303, Multiword + 2097152, 0.361, 9.199, 13.790, 12.084, 5.806, 8.235, 1.317,, 1.317, Multiword + 4194304, 0.361, 9.262, 13.835, 12.137, 5.852, 8.256, 1.321,, 1.321, Multiword + 8388608, 0.586, 9.493, 14.077, 12.388, 6.037, 8.419, 1.438,, 1.438, Multiword + 16777216, 0.587, 9.496, 14.108, 12.423, 6.046, 8.438, 1.438,, 1.438, Multiword + 33554432, 0.587, 9.500, 14.132, 12.417, 6.048, 8.454, 1.444,, 1.444, Multiword + 67108864, 0.599, 9.512, 14.131, 12.424, 6.025, 8.469, 1.441,, 1.441, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 64, 8, 8, 8, 3, 0, 33376, 161667 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 21.787, 18.251,, 18.251, Multiword + 8, 10.376, 9.532,, 9.532, Multiword + 16, 8.522, 7.496,, 7.496, Multiword + 32, 7.396, 6.587,, 6.587, Multiword + 64, 6.839, 7.204,, 6.839, Blockword + 128, 6.594, 7.579,, 6.594, Blockword + 256, 6.504, 7.547,, 6.504, Blockword + 512, 6.430, 7.567,, 6.430, Blockword + 1024, 6.396, 7.562,, 6.396, Blockword + 2048, 6.405, 7.588,, 6.405, Blockword + 4096, 6.390, 7.609,, 6.390, Blockword + 8192, 6.383, 7.564,, 6.383, Blockword + 16384, 6.398, 7.579,, 6.398, Blockword + 32768, 6.417, 7.619,, 6.417, Blockword + 65536, 7.486, 7.586,, 7.486, Blockword + 131072, 7.450, 7.582,, 7.450, Blockword + 262144, 7.750, 7.651,, 7.651, Multiword + 524288, 7.859, 7.660,, 7.660, Multiword + 1048576, 7.882, 7.702,, 7.702, Multiword + 2097152, 7.927, 7.716,, 7.716, Multiword + 4194304, 7.964, 7.770,, 7.770, Multiword + 8388608, 8.174, 7.958,, 7.958, Multiword + 16777216, 8.175, 8.006,, 8.006, Multiword + 33554432, 8.238, 8.001,, 8.001, Multiword + 67108864, 8.219, 8.016,, 8.016, Multiword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 8, 8, 8, 4, 0, 33376, 1155186 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 10.547, 15.091, 18.248, 17.474, 17.086, 21.882, 14.530, 11.376,, 11.376, CRC32C + 8, 3.513, 11.815, 15.771, 15.199, 9.626, 11.001, 8.126, 6.870,, 6.870, CRC32C + 16, 1.825, 10.688, 14.914, 13.565, 7.750, 8.675, 5.288, 4.340,, 4.340, CRC32C + 32, 1.477, 9.346, 14.205, 12.751, 6.615, 7.508, 3.677, 3.385,, 3.385, CRC32C + 64, 0.884, 9.325, 13.820, 12.297, 6.183, 6.940, 2.366, 2.985,, 2.366, Multiword + 128, 0.594, 9.321, 13.737, 12.155, 5.868, 6.540, 1.803, 2.861,, 1.803, Multiword + 256, 0.458, 9.161, 13.655, 12.053, 5.762, 6.478, 1.550, 2.709,, 1.550, Multiword + 512, 0.388, 9.075, 13.633, 11.969, 5.657, 6.412, 1.407, 3.472,, 1.407, Multiword + 1024, 0.371, 9.053, 13.669, 11.954, 5.714, 6.364, 1.338, 3.446,, 1.338, Multiword + 2048, 0.342, 9.025, 13.617, 11.934, 5.695, 6.323, 1.303, 3.460,, 1.303, Multiword + 4096, 0.333, 9.015, 13.590, 11.927, 5.692, 6.322, 1.290, 3.426,, 1.290, Multiword + 8192, 0.326, 9.014, 13.583, 11.924, 5.688, 6.320, 1.289, 3.426,, 1.289, Multiword + 16384, 0.322, 9.014, 13.582, 11.917, 5.708, 6.346, 1.292, 3.428,, 1.292, Multiword + 32768, 0.328, 9.047, 13.582, 11.917, 5.719, 6.357, 1.301, 3.441,, 1.301, Multiword + 65536, 0.358, 9.072, 13.583, 11.917, 5.722, 8.026, 1.305, 3.445,, 1.305, Multiword + 131072, 0.356, 9.079, 13.586, 11.920, 5.727, 8.018, 1.302, 3.446,, 1.302, Multiword + 262144, 0.358, 9.127, 13.683, 12.010, 5.731, 8.069, 1.302, 3.447,, 1.302, Multiword + 524288, 0.357, 9.155, 13.736, 12.054, 5.779, 8.100, 1.301, 3.449,, 1.301, Multiword + 1048576, 0.359, 9.187, 13.760, 12.069, 5.804, 8.208, 1.304, 3.473,, 1.304, Multiword + 2097152, 0.361, 9.206, 13.793, 12.081, 5.802, 8.194, 1.317, 3.491,, 1.317, Multiword + 4194304, 0.363, 9.242, 13.836, 12.126, 5.850, 8.244, 1.324, 3.504,, 1.324, Multiword + 8388608, 0.589, 9.466, 14.127, 12.392, 6.013, 8.418, 1.435, 3.654,, 1.435, Multiword + 16777216, 0.593, 9.490, 14.133, 12.419, 6.053, 8.414, 1.435, 3.670,, 1.435, Multiword + 33554432, 0.590, 9.509, 14.132, 12.428, 6.047, 8.424, 1.444, 3.669,, 1.444, Multiword + 67108864, 0.591, 9.514, 14.118, 12.419, 6.053, 8.434, 1.441, 3.672,, 1.441, Multiword + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 8, 8, 8, 3, 0, 33376, 1166436 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 21.802, 17.772, 11.251,, 11.251, CRC32C + 8, 10.376, 9.584, 7.051,, 7.051, CRC32C + 16, 8.439, 7.725, 4.338,, 4.338, CRC32C + 32, 7.282, 6.640, 3.399,, 3.399, CRC32C + 64, 6.751, 7.375, 2.990,, 2.990, CRC32C + 128, 6.649, 7.649, 2.843,, 2.843, CRC32C + 256, 6.495, 7.493, 2.728,, 2.728, CRC32C + 512, 6.423, 7.553, 3.448,, 3.448, CRC32C + 1024, 6.436, 7.512, 3.463,, 3.463, CRC32C + 2048, 6.374, 7.591, 3.465,, 3.465, CRC32C + 4096, 6.388, 7.586, 3.424,, 3.424, CRC32C + 8192, 6.387, 7.558, 3.423,, 3.423, CRC32C + 16384, 6.391, 7.603, 3.429,, 3.429, CRC32C + 32768, 6.415, 7.584, 3.440,, 3.440, CRC32C + 65536, 7.423, 7.580, 3.445,, 3.445, CRC32C + 131072, 7.405, 7.580, 3.447,, 3.447, CRC32C + 262144, 7.721, 7.635, 3.447,, 3.447, CRC32C + 524288, 7.828, 7.675, 3.469,, 3.469, CRC32C + 1048576, 7.852, 7.701, 3.488,, 3.488, CRC32C + 2097152, 7.931, 7.722, 3.485,, 3.485, CRC32C + 4194304, 7.955, 7.722, 3.502,, 3.502, CRC32C + 8388608, 8.134, 7.973, 3.658,, 3.658, CRC32C + 16777216, 8.158, 7.996, 3.666,, 3.666, CRC32C + 33554432, 8.133, 8.000, 3.673,, 3.673, CRC32C + 67108864, 8.193, 8.007, 3.680,, 3.680, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 4, 4, 4, 4, 0, 8528, 1097415 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 5.747, 8.411, 8.605, 8.666, 8.377, 10.244, 8.626, 9.001,, 8.377, Word + 8, 3.095, 6.972, 7.111, 6.337, 6.224, 6.138, 5.595, 5.789,, 5.595, Multiword + 16, 1.761, 7.288, 7.387, 5.881, 3.688, 4.657, 4.094, 3.851,, 3.688, Word + 32, 0.924, 7.397, 7.400, 6.240, 3.280, 4.064, 4.172, 3.177,, 3.177, CRC32C + 64, 0.654, 7.437, 7.457, 6.193, 2.946, 3.752, 3.626, 2.805,, 2.805, CRC32C + 128, 0.450, 7.563, 7.526, 6.218, 2.766, 3.624, 3.400, 2.751,, 2.751, CRC32C + 256, 0.350, 7.481, 7.568, 6.228, 2.725, 3.547, 3.293, 2.672,, 2.672, CRC32C + 512, 0.301, 7.412, 7.659, 6.220, 2.694, 3.522, 3.231, 3.461,, 2.694, Word + 1024, 0.275, 7.388, 7.625, 6.221, 2.669, 3.476, 3.208, 3.472,, 2.669, Word + 2048, 0.270, 7.346, 7.607, 6.238, 2.635, 3.475, 3.205, 3.456,, 2.635, Word + 4096, 0.259, 7.348, 7.596, 6.204, 2.612, 3.464, 3.192, 3.423,, 2.612, Word + 8192, 0.255, 7.338, 7.594, 6.213, 2.600, 3.465, 3.188, 3.422,, 2.600, Word + 16384, 0.253, 7.335, 7.597, 6.198, 2.592, 3.460, 3.180, 3.425,, 2.592, Word + 32768, 0.262, 7.337, 7.606, 6.218, 2.593, 3.462, 3.190, 3.434,, 2.593, Word + 65536, 0.308, 7.336, 7.608, 6.202, 2.590, 2.995, 3.193, 3.438,, 2.590, Word + 131072, 0.308, 7.335, 7.600, 6.200, 2.590, 2.993, 3.198, 3.440,, 2.590, Word + 262144, 0.309, 7.384, 7.695, 6.205, 2.589, 2.991, 3.200, 3.442,, 2.589, Word + 524288, 0.308, 7.413, 7.727, 6.255, 2.589, 2.989, 3.202, 3.444,, 2.589, Word + 1048576, 0.309, 7.422, 7.725, 6.275, 2.623, 2.981, 3.225, 3.466,, 2.623, Word + 2097152, 0.312, 7.424, 7.749, 6.294, 2.647, 2.995, 3.240, 3.480,, 2.647, Word + 4194304, 0.314, 7.460, 7.783, 6.308, 2.669, 3.002, 3.247, 3.492,, 2.669, Word + 8388608, 0.551, 7.701, 7.866, 6.526, 2.795, 3.153, 3.409, 3.662,, 2.795, Word + 16777216, 0.553, 7.635, 8.019, 6.532, 2.804, 3.156, 3.407, 3.667,, 2.804, Word + 33554432, 0.556, 7.720, 8.019, 6.539, 2.803, 3.163, 3.415, 3.672,, 2.803, Word + 67108864, 0.558, 7.718, 8.019, 6.545, 2.813, 3.162, 3.422, 3.661,, 2.813, Word + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 4, 4, 4, 3, 0, 8528, 1098198 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 9.687, 13.251, 8.938,, 8.938, CRC32C + 8, 6.293, 5.936, 5.711,, 5.711, CRC32C + 16, 4.708, 4.477, 3.852,, 3.852, CRC32C + 32, 4.027, 3.735, 3.169,, 3.169, CRC32C + 64, 3.760, 3.332, 2.805,, 2.805, CRC32C + 128, 3.543, 3.164, 2.757,, 2.757, CRC32C + 256, 3.484, 3.084, 2.657,, 2.657, CRC32C + 512, 3.485, 3.050, 3.471,, 3.050, Multiword + 1024, 3.444, 3.018, 3.464,, 3.018, Multiword + 2048, 3.406, 3.002, 3.449,, 3.002, Multiword + 4096, 3.407, 2.982, 3.428,, 2.982, Multiword + 8192, 3.409, 2.991, 3.425,, 2.991, Multiword + 16384, 3.398, 2.997, 3.429,, 2.997, Multiword + 32768, 3.409, 3.018, 3.436,, 3.018, Multiword + 65536, 2.839, 3.020, 3.441,, 2.839, Blockword + 131072, 2.825, 3.019, 3.444,, 2.825, Blockword + 262144, 2.675, 3.018, 3.445,, 2.675, Blockword + 524288, 2.603, 3.021, 3.447,, 2.603, Blockword + 1048576, 2.616, 3.044, 3.472,, 2.616, Blockword + 2097152, 2.615, 3.056, 3.487,, 2.615, Blockword + 4194304, 2.619, 3.080, 3.501,, 2.619, Blockword + 8388608, 2.753, 3.172, 3.656,, 2.753, Blockword + 16777216, 2.759, 3.227, 3.671,, 2.759, Blockword + 33554432, 2.767, 3.226, 3.673,, 2.767, Blockword + 67108864, 2.770, 3.223, 3.674,, 2.770, Blockword + diff --git a/crcutil-1.0/doc/data/test-gcc-32-noasm-1.csv b/crcutil-1.0/doc/data/test-gcc-32-noasm-1.csv new file mode 100644 index 0000000..599c239 --- /dev/null +++ b/crcutil-1.0/doc/data/test-gcc-32-noasm-1.csv @@ -0,0 +1,310 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 8, 4, 0, 66720, 1424088 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 9.001, 14.502, 15.081, 15.643, 16.746, 15.720, 15.710,, 14.502, Byte + 8, 4.251, 12.385, 12.267, 12.341, 7.875, 7.633, 7.177,, 7.177, Multiword + 16, 2.375, 12.366, 12.345, 11.397, 6.119, 5.610, 5.489,, 5.489, Multiword + 32, 1.625, 12.386, 12.328, 11.282, 5.194, 4.727, 4.689,, 4.689, Multiword + 64, 1.188, 12.425, 12.335, 11.657, 4.724, 4.255, 4.835,, 4.255, Blockword + 128, 0.993, 12.828, 12.407, 11.565, 4.347, 4.035, 4.602,, 4.035, Blockword + 256, 0.934, 12.691, 12.421, 11.506, 4.231, 3.927, 4.572,, 3.927, Blockword + 512, 0.914, 12.619, 12.453, 11.477, 4.332, 3.886, 4.633,, 3.886, Blockword + 1024, 0.890, 12.635, 12.550, 11.451, 4.661, 4.187, 4.718,, 4.187, Blockword + 2048, 0.883, 12.591, 12.586, 11.449, 4.692, 4.237, 4.725,, 4.237, Blockword + 4096, 0.885, 12.565, 12.596, 11.442, 4.642, 4.162, 4.659,, 4.162, Blockword + 8192, 0.880, 12.554, 12.507, 11.452, 4.689, 4.241, 4.661,, 4.241, Blockword + 16384, 0.878, 12.494, 12.449, 11.443, 4.752, 4.252, 4.660,, 4.252, Blockword + 32768, 0.876, 12.532, 12.444, 11.453, 4.769, 4.288, 4.647,, 4.288, Blockword + 65536, 0.876, 12.531, 12.437, 11.458, 4.785, 5.461, 4.645,, 4.645, Multiword + 131072, 0.875, 12.522, 12.434, 11.457, 4.777, 5.158, 4.639,, 4.639, Multiword + 262144, 0.875, 12.610, 12.517, 11.517, 4.805, 5.001, 4.641,, 4.641, Multiword + 524288, 0.875, 12.656, 12.583, 11.589, 4.788, 4.970, 4.678,, 4.678, Multiword + 1048576, 0.875, 12.687, 12.620, 11.594, 4.854, 4.965, 4.691,, 4.691, Multiword + 2097152, 0.875, 12.694, 12.678, 11.616, 4.880, 4.972, 4.701,, 4.701, Multiword + 4194304, 0.913, 12.753, 12.815, 11.664, 4.910, 4.969, 4.734,, 4.734, Multiword + 8388608, 0.999, 13.047, 12.996, 11.876, 5.061, 5.131, 4.909,, 4.909, Multiword + 16777216, 0.998, 13.072, 13.012, 11.930, 4.976, 5.129, 4.911,, 4.911, Multiword + 33554432, 0.999, 13.055, 13.040, 11.947, 5.092, 5.152, 4.886,, 4.886, Multiword + 67108864, 1.001, 13.072, 13.025, 11.944, 5.058, 5.138, 4.923,, 4.923, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 8, 3, 0, 66720, 1368999 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 17.492, 15.757,, 15.757, Multiword + 8, 8.001, 7.388,, 7.388, Multiword + 16, 5.950, 5.669,, 5.669, Multiword + 32, 4.933, 4.671,, 4.671, Multiword + 64, 4.357, 5.172,, 4.357, Blockword + 128, 4.049, 4.599,, 4.049, Blockword + 256, 3.969, 4.286,, 3.969, Blockword + 512, 3.939, 4.267,, 3.939, Blockword + 1024, 4.193, 4.396,, 4.193, Blockword + 2048, 4.243, 4.352,, 4.243, Blockword + 4096, 4.193, 4.309,, 4.193, Blockword + 8192, 4.219, 4.292,, 4.219, Blockword + 16384, 4.278, 4.289,, 4.278, Blockword + 32768, 4.276, 4.272,, 4.272, Multiword + 65536, 5.288, 4.272,, 4.272, Multiword + 131072, 4.973, 4.264,, 4.264, Multiword + 262144, 4.916, 4.269,, 4.269, Multiword + 524288, 4.913, 4.296,, 4.296, Multiword + 1048576, 4.886, 4.316,, 4.316, Multiword + 2097152, 4.893, 4.323,, 4.323, Multiword + 4194304, 4.902, 4.349,, 4.349, Multiword + 8388608, 5.061, 4.511,, 4.511, Multiword + 16777216, 5.080, 4.527,, 4.527, Multiword + 33554432, 5.082, 4.471,, 4.471, Multiword + 67108864, 5.086, 4.531,, 4.531, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 4, 4, 0, 33952, 1295964 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 8.251, 14.510, 15.110, 15.641, 9.752, 11.874, 11.015,, 9.752, Word + 8, 4.501, 12.388, 12.332, 12.493, 6.813, 7.872, 7.375,, 6.813, Word + 16, 2.563, 12.369, 12.260, 11.396, 5.438, 5.966, 5.798,, 5.438, Word + 32, 1.500, 12.389, 12.235, 11.285, 4.830, 5.105, 4.212,, 4.212, Multiword + 64, 1.034, 12.424, 12.301, 11.657, 4.473, 4.706, 3.305,, 3.305, Multiword + 128, 0.938, 12.828, 12.405, 11.550, 4.365, 4.441, 2.871,, 2.871, Multiword + 256, 0.813, 12.692, 12.372, 11.506, 4.266, 4.452, 2.641,, 2.641, Multiword + 512, 0.756, 12.619, 12.453, 11.477, 4.191, 4.496, 2.544,, 2.544, Multiword + 1024, 0.829, 12.636, 12.550, 11.448, 4.214, 4.421, 2.470,, 2.470, Multiword + 2048, 0.726, 12.592, 12.583, 11.449, 4.165, 4.371, 2.428,, 2.428, Multiword + 4096, 0.715, 12.566, 12.594, 11.442, 4.131, 4.364, 2.440,, 2.440, Multiword + 8192, 0.709, 12.558, 12.503, 11.452, 4.156, 4.358, 2.427,, 2.427, Multiword + 16384, 0.803, 12.494, 12.449, 11.453, 4.184, 4.346, 2.452,, 2.452, Multiword + 32768, 0.705, 12.534, 12.445, 11.453, 4.182, 4.355, 2.470,, 2.470, Multiword + 65536, 0.710, 12.530, 12.437, 11.452, 4.175, 3.577, 2.475,, 2.475, Multiword + 131072, 0.705, 12.522, 12.413, 11.459, 4.158, 3.261, 2.475,, 2.475, Multiword + 262144, 0.713, 12.620, 12.521, 11.544, 4.176, 3.108, 2.477,, 2.477, Multiword + 524288, 0.712, 12.652, 12.550, 11.594, 4.212, 3.028, 2.479,, 2.479, Multiword + 1048576, 0.717, 12.684, 12.610, 11.598, 4.234, 2.923, 2.502,, 2.502, Multiword + 2097152, 0.725, 12.717, 12.703, 11.618, 4.252, 2.919, 2.506,, 2.506, Multiword + 4194304, 0.775, 12.761, 12.770, 11.666, 4.260, 2.913, 2.515,, 2.515, Multiword + 8388608, 0.886, 13.036, 12.999, 11.924, 4.442, 3.040, 2.658,, 2.658, Multiword + 16777216, 0.908, 13.057, 13.019, 11.891, 4.447, 3.045, 2.652,, 2.652, Multiword + 33554432, 0.911, 13.066, 13.039, 11.893, 4.458, 3.056, 2.668,, 2.668, Multiword + 67108864, 0.920, 13.059, 13.041, 11.946, 4.460, 3.049, 2.667,, 2.667, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 128, 16, 16, 4, 3, 0, 33952, 1268838 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 12.167, 9.874,, 9.874, Multiword + 8, 7.907, 6.833,, 6.833, Multiword + 16, 6.077, 5.517,, 5.517, Multiword + 32, 5.137, 4.162,, 4.162, Multiword + 64, 4.696, 2.987,, 2.987, Multiword + 128, 4.510, 2.587,, 2.587, Multiword + 256, 4.483, 2.312,, 2.312, Multiword + 512, 4.473, 2.210,, 2.210, Multiword + 1024, 4.401, 2.166,, 2.166, Multiword + 2048, 4.375, 2.121,, 2.121, Multiword + 4096, 4.366, 2.096,, 2.096, Multiword + 8192, 4.357, 2.089,, 2.089, Multiword + 16384, 4.350, 2.091,, 2.091, Multiword + 32768, 4.347, 2.094,, 2.094, Multiword + 65536, 3.749, 2.093,, 2.093, Multiword + 131072, 3.436, 2.092,, 2.092, Multiword + 262144, 2.979, 2.091,, 2.091, Multiword + 524288, 2.749, 2.092,, 2.092, Multiword + 1048576, 2.723, 2.108,, 2.108, Multiword + 2097152, 2.686, 2.118,, 2.118, Multiword + 4194304, 2.680, 2.124,, 2.124, Multiword + 8388608, 2.803, 2.253,, 2.253, Multiword + 16777216, 2.800, 2.262,, 2.262, Multiword + 33554432, 2.804, 2.266,, 2.266, Multiword + 67108864, 2.804, 2.268,, 2.268, Multiword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 64, 8, 8, 8, 4, 0, 33376, 150786 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 10.630, 14.502, 18.405, 18.031, 17.502, 21.509, 17.426,, 14.502, Byte + 8, 3.286, 11.851, 15.812, 15.002, 10.011, 11.025, 9.887,, 9.887, Multiword + 16, 1.751, 10.420, 15.033, 13.799, 7.627, 8.852, 7.503,, 7.503, Multiword + 32, 1.438, 9.713, 14.205, 12.812, 6.824, 7.395, 6.583,, 6.583, Multiword + 64, 0.860, 9.304, 13.834, 12.297, 6.144, 6.864, 7.859,, 6.144, Word + 128, 0.590, 9.289, 13.737, 12.199, 5.990, 6.528, 8.149,, 5.990, Word + 256, 0.456, 9.182, 13.657, 12.015, 5.673, 6.426, 8.120,, 5.673, Word + 512, 0.382, 9.095, 13.647, 11.973, 5.733, 6.378, 8.107,, 5.733, Word + 1024, 0.373, 9.095, 13.671, 11.961, 5.722, 6.355, 8.106,, 5.722, Word + 2048, 0.343, 9.057, 13.617, 11.931, 5.701, 6.338, 8.099,, 5.701, Word + 4096, 0.332, 9.076, 13.592, 11.921, 5.698, 6.315, 8.114,, 5.698, Word + 8192, 0.326, 9.071, 13.653, 11.920, 5.689, 6.329, 8.109,, 5.689, Word + 16384, 0.322, 9.064, 13.618, 11.914, 5.712, 6.349, 8.142,, 5.712, Word + 32768, 0.328, 9.064, 13.640, 11.916, 5.721, 6.361, 8.161,, 5.721, Word + 65536, 0.359, 9.056, 13.622, 11.915, 5.726, 8.104, 8.168,, 5.726, Word + 131072, 0.359, 9.052, 13.629, 11.919, 5.722, 8.017, 8.169,, 5.722, Word + 262144, 0.359, 9.157, 13.689, 11.975, 5.732, 8.084, 8.215,, 5.732, Word + 524288, 0.359, 9.166, 13.742, 12.049, 5.775, 8.076, 8.231,, 5.775, Word + 1048576, 0.359, 9.204, 13.761, 12.061, 5.799, 8.178, 8.262,, 5.799, Word + 2097152, 0.362, 9.222, 13.791, 12.082, 5.807, 8.197, 8.275,, 5.807, Word + 4194304, 0.363, 9.266, 13.825, 12.127, 5.840, 8.213, 8.316,, 5.840, Word + 8388608, 0.586, 9.517, 14.090, 12.391, 6.030, 8.392, 8.545,, 6.030, Word + 16777216, 0.593, 9.530, 14.095, 12.409, 6.049, 8.421, 8.506,, 6.049, Word + 33554432, 0.589, 9.533, 14.106, 12.410, 6.044, 8.438, 8.570,, 6.044, Word + 67108864, 0.600, 9.531, 14.122, 12.422, 6.055, 8.453, 8.573,, 6.055, Word + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 64, 8, 8, 8, 3, 0, 33376, 162837 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 27.251, 17.522,, 17.522, Multiword + 8, 10.376, 9.675,, 9.675, Multiword + 16, 8.524, 7.611,, 7.611, Multiword + 32, 7.397, 6.640,, 6.640, Multiword + 64, 6.852, 7.344,, 6.852, Blockword + 128, 6.595, 7.525,, 6.595, Blockword + 256, 6.516, 7.548,, 6.516, Blockword + 512, 6.441, 7.557,, 6.441, Blockword + 1024, 6.402, 7.576,, 6.402, Blockword + 2048, 6.395, 7.544,, 6.395, Blockword + 4096, 6.380, 7.568,, 6.380, Blockword + 8192, 6.384, 7.561,, 6.384, Blockword + 16384, 6.391, 7.575,, 6.391, Blockword + 32768, 6.416, 7.584,, 6.416, Blockword + 65536, 7.477, 7.587,, 7.477, Blockword + 131072, 7.451, 7.602,, 7.451, Blockword + 262144, 7.719, 7.666,, 7.666, Multiword + 524288, 7.882, 7.672,, 7.672, Multiword + 1048576, 7.902, 7.711,, 7.711, Multiword + 2097152, 7.953, 7.678,, 7.678, Multiword + 4194304, 7.976, 7.771,, 7.771, Multiword + 8388608, 8.199, 7.972,, 7.972, Multiword + 16777216, 8.196, 7.980,, 7.980, Multiword + 33554432, 8.217, 7.988,, 7.988, Multiword + 67108864, 8.246, 7.989,, 7.989, Multiword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 8, 8, 8, 4, 0, 33376, 1145943 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 10.795, 14.376, 18.322, 18.045, 17.503, 21.513, 17.763, 11.251,, 11.251, CRC32C + 8, 3.221, 11.973, 15.797, 15.002, 10.030, 11.042, 9.868, 7.014,, 7.014, CRC32C + 16, 1.718, 10.420, 15.032, 13.802, 7.699, 8.806, 7.882, 4.308,, 4.308, CRC32C + 32, 1.449, 9.713, 14.208, 12.750, 6.671, 7.317, 6.783, 3.394,, 3.394, CRC32C + 64, 0.864, 9.332, 13.909, 12.432, 6.105, 6.898, 7.938, 2.954,, 2.954, CRC32C + 128, 0.595, 9.375, 13.656, 12.162, 5.938, 6.515, 8.016, 2.845,, 2.845, CRC32C + 256, 0.460, 9.194, 13.655, 12.024, 5.819, 6.462, 8.028, 2.697,, 2.697, CRC32C + 512, 0.382, 9.135, 13.651, 11.956, 5.783, 6.343, 8.117, 3.478,, 3.478, CRC32C + 1024, 0.372, 9.121, 13.671, 11.941, 5.700, 6.364, 8.084, 3.475,, 3.475, CRC32C + 2048, 0.343, 9.093, 13.613, 11.924, 5.705, 6.308, 8.091, 3.458,, 3.458, CRC32C + 4096, 0.332, 9.082, 13.588, 11.924, 5.707, 6.306, 8.108, 3.436,, 3.436, CRC32C + 8192, 0.325, 9.071, 13.586, 11.909, 5.697, 6.325, 8.115, 3.427,, 3.427, CRC32C + 16384, 0.322, 9.066, 13.601, 11.909, 5.710, 6.348, 8.137, 3.432,, 3.432, CRC32C + 32768, 0.328, 9.071, 13.611, 11.912, 5.721, 6.362, 8.158, 3.443,, 3.443, CRC32C + 65536, 0.359, 9.064, 13.608, 11.915, 5.724, 7.972, 8.163, 3.444,, 3.444, CRC32C + 131072, 0.359, 9.085, 13.596, 11.918, 5.726, 7.961, 8.156, 3.447,, 3.447, CRC32C + 262144, 0.359, 9.150, 13.677, 12.005, 5.730, 8.047, 8.221, 3.447,, 3.447, CRC32C + 524288, 0.358, 9.183, 13.733, 12.036, 5.776, 8.094, 8.247, 3.449,, 3.449, CRC32C + 1048576, 0.359, 9.214, 13.765, 12.060, 5.793, 8.148, 8.258, 3.472,, 3.472, CRC32C + 2097152, 0.362, 9.224, 13.786, 12.072, 5.805, 8.169, 8.288, 3.484,, 3.484, CRC32C + 4194304, 0.363, 9.286, 13.844, 12.135, 5.841, 8.240, 8.322, 3.501,, 3.501, CRC32C + 8388608, 0.592, 9.542, 14.102, 12.407, 6.024, 8.394, 8.523, 3.660,, 3.660, CRC32C + 16777216, 0.588, 9.493, 14.099, 12.416, 5.969, 8.431, 8.586, 3.686,, 3.686, CRC32C + 33554432, 0.598, 9.512, 14.099, 12.409, 5.940, 8.407, 8.474, 3.627,, 3.627, CRC32C + 67108864, 0.597, 9.524, 14.108, 12.406, 6.050, 8.436, 8.571, 3.676,, 3.676, CRC32C + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 8, 8, 8, 3, 0, 33376, 1164897 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 27.001, 17.511, 11.251,, 11.251, CRC32C + 8, 12.626, 10.234, 7.047,, 7.047, CRC32C + 16, 9.501, 7.849, 4.302,, 4.302, CRC32C + 32, 7.875, 6.659, 3.406,, 3.406, CRC32C + 64, 7.125, 7.454, 2.988,, 2.988, CRC32C + 128, 6.821, 7.603, 2.844,, 2.844, CRC32C + 256, 6.518, 7.477, 2.696,, 2.696, CRC32C + 512, 6.417, 7.507, 3.448,, 3.448, CRC32C + 1024, 6.410, 7.508, 3.475,, 3.475, CRC32C + 2048, 6.386, 7.559, 3.463,, 3.463, CRC32C + 4096, 6.398, 7.553, 3.424,, 3.424, CRC32C + 8192, 6.390, 7.561, 3.427,, 3.427, CRC32C + 16384, 6.407, 7.574, 3.428,, 3.428, CRC32C + 32768, 6.417, 7.582, 3.440,, 3.440, CRC32C + 65536, 7.423, 7.579, 3.444,, 3.444, CRC32C + 131072, 7.406, 7.580, 3.447,, 3.447, CRC32C + 262144, 7.728, 7.679, 3.447,, 3.447, CRC32C + 524288, 7.850, 7.671, 3.449,, 3.449, CRC32C + 1048576, 7.871, 7.678, 3.472,, 3.472, CRC32C + 2097152, 7.900, 7.691, 3.495,, 3.495, CRC32C + 4194304, 7.960, 7.709, 3.503,, 3.503, CRC32C + 8388608, 8.151, 7.997, 3.660,, 3.660, CRC32C + 16777216, 8.131, 7.990, 3.679,, 3.679, CRC32C + 33554432, 8.187, 8.004, 3.692,, 3.692, CRC32C + 67108864, 8.196, 7.963, 3.637,, 3.637, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 4, 4, 4, 4, 0, 8528, 1101600 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 5.508, 8.411, 9.418, 8.922, 8.401, 9.790, 8.627, 9.001,, 8.401, Word + 8, 2.796, 6.972, 7.035, 6.292, 5.957, 6.138, 5.672, 5.818,, 5.672, Multiword + 16, 1.643, 7.256, 7.387, 5.896, 3.579, 4.690, 4.094, 3.851,, 3.579, Word + 32, 0.826, 7.404, 7.392, 6.251, 3.209, 4.077, 4.172, 3.164,, 3.164, CRC32C + 64, 0.563, 7.480, 7.457, 6.225, 2.914, 3.752, 3.620, 2.805,, 2.805, CRC32C + 128, 0.391, 7.555, 7.525, 6.242, 2.789, 3.604, 3.407, 2.700,, 2.700, CRC32C + 256, 0.328, 7.426, 7.568, 6.218, 2.714, 3.524, 3.280, 2.682,, 2.682, CRC32C + 512, 0.301, 7.391, 7.653, 6.229, 2.656, 3.524, 3.231, 3.464,, 2.656, Word + 1024, 0.277, 7.385, 7.623, 6.210, 2.644, 3.505, 3.209, 3.470,, 2.644, Word + 2048, 0.269, 7.356, 7.607, 6.233, 2.659, 3.473, 3.200, 3.451,, 2.659, Word + 4096, 0.260, 7.340, 7.596, 6.231, 2.620, 3.465, 3.189, 3.423,, 2.620, Word + 8192, 0.255, 7.336, 7.594, 6.224, 2.606, 3.463, 3.189, 3.422,, 2.606, Word + 16384, 0.253, 7.335, 7.611, 6.208, 2.592, 3.464, 3.183, 3.425,, 2.592, Word + 32768, 0.262, 7.337, 7.606, 6.216, 2.592, 3.461, 3.193, 3.436,, 2.592, Word + 65536, 0.308, 7.336, 7.608, 6.207, 2.591, 2.999, 3.195, 3.439,, 2.591, Word + 131072, 0.308, 7.335, 7.597, 6.204, 2.590, 2.993, 3.200, 3.440,, 2.590, Word + 262144, 0.309, 7.352, 7.671, 6.205, 2.589, 2.990, 3.200, 3.441,, 2.589, Word + 524288, 0.309, 7.401, 7.699, 6.250, 2.589, 2.989, 3.203, 3.444,, 2.589, Word + 1048576, 0.309, 7.428, 7.729, 6.275, 2.629, 2.981, 3.226, 3.472,, 2.629, Word + 2097152, 0.312, 7.434, 7.745, 6.294, 2.652, 2.993, 3.242, 3.478,, 2.652, Word + 4194304, 0.312, 7.462, 7.780, 6.325, 2.677, 3.006, 3.251, 3.497,, 2.677, Word + 8388608, 0.554, 7.684, 7.906, 6.523, 2.794, 3.143, 3.399, 3.643,, 2.794, Word + 16777216, 0.558, 7.694, 8.007, 6.478, 2.816, 3.150, 3.397, 3.663,, 2.816, Word + 33554432, 0.564, 7.702, 7.996, 6.497, 2.827, 3.160, 3.418, 3.669,, 2.827, Word + 67108864, 0.568, 7.640, 7.984, 6.464, 2.772, 3.137, 3.369, 3.652,, 2.772, Word + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 32, 32, 4, 4, 4, 3, 0, 8528, 1098342 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 9.712, 8.364, 9.001,, 8.364, Multiword + 8, 6.285, 5.884, 5.906,, 5.884, Multiword + 16, 4.683, 4.250, 3.871,, 3.871, CRC32C + 32, 4.027, 3.736, 3.165,, 3.165, CRC32C + 64, 3.729, 3.337, 2.805,, 2.805, CRC32C + 128, 3.543, 3.164, 2.774,, 2.774, CRC32C + 256, 3.484, 3.072, 2.695,, 2.695, CRC32C + 512, 3.441, 3.050, 3.464,, 3.050, Multiword + 1024, 3.433, 3.015, 3.465,, 3.015, Multiword + 2048, 3.434, 2.998, 3.439,, 2.998, Multiword + 4096, 3.367, 2.982, 3.426,, 2.982, Multiword + 8192, 3.388, 2.987, 3.426,, 2.987, Multiword + 16384, 3.396, 2.992, 3.428,, 2.992, Multiword + 32768, 3.404, 3.020, 3.439,, 3.020, Multiword + 65536, 2.841, 3.020, 3.442,, 2.841, Blockword + 131072, 2.828, 3.021, 3.444,, 2.828, Blockword + 262144, 2.676, 3.020, 3.445,, 2.676, Blockword + 524288, 2.603, 3.025, 3.448,, 2.603, Blockword + 1048576, 2.621, 3.048, 3.482,, 2.621, Blockword + 2097152, 2.606, 3.058, 3.482,, 2.606, Blockword + 4194304, 2.626, 3.081, 3.501,, 2.626, Blockword + 8388608, 2.749, 3.218, 3.647,, 2.749, Blockword + 16777216, 2.706, 3.240, 3.624,, 2.706, Blockword + 33554432, 2.773, 3.226, 3.647,, 2.773, Blockword + 67108864, 2.749, 3.228, 3.658,, 2.749, Blockword + diff --git a/crcutil-1.0/doc/data/test-gcc-64-1.csv b/crcutil-1.0/doc/data/test-gcc-64-1.csv new file mode 100644 index 0000000..84ad8a8 --- /dev/null +++ b/crcutil-1.0/doc/data/test-gcc-64-1.csv @@ -0,0 +1,434 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 4, 0, 66736, 1122039 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.772, 9.074, 9.324, 9.261, 9.503, 12.238, 10.009,, 9.074, Byte + 8, 3.192, 8.603, 8.619, 8.739, 4.241, 5.405, 4.646,, 4.241, Word + 16, 1.890, 8.987, 8.998, 8.075, 3.369, 3.944, 3.626,, 3.369, Word + 32, 1.380, 9.222, 9.230, 8.116, 2.835, 3.211, 3.287,, 2.835, Word + 64, 1.102, 9.329, 9.323, 8.289, 2.645, 2.829, 2.580,, 2.580, Multiword + 128, 0.961, 9.672, 9.378, 8.326, 2.537, 2.651, 2.069,, 2.069, Multiword + 256, 0.887, 9.568, 9.389, 8.338, 2.452, 2.559, 1.824,, 1.824, Multiword + 512, 0.849, 9.517, 9.455, 8.360, 2.446, 2.522, 1.771,, 1.771, Multiword + 1024, 0.832, 9.483, 9.448, 8.350, 2.659, 2.782, 1.812,, 1.812, Multiword + 2048, 0.821, 9.474, 9.435, 8.360, 2.904, 2.935, 1.813,, 1.813, Multiword + 4096, 0.821, 9.458, 9.391, 8.360, 2.804, 2.826, 1.751,, 1.751, Multiword + 8192, 0.813, 9.462, 9.422, 8.366, 2.887, 2.880, 1.756,, 1.756, Multiword + 16384, 0.807, 9.446, 9.365, 8.308, 2.932, 2.965, 1.751,, 1.751, Multiword + 32768, 0.808, 9.421, 9.386, 8.362, 2.937, 2.968, 1.740,, 1.740, Multiword + 65536, 0.800, 9.447, 9.386, 8.360, 2.942, 2.689, 1.730,, 1.730, Multiword + 131072, 0.782, 9.451, 9.412, 8.358, 2.950, 2.437, 1.734,, 1.734, Multiword + 262144, 0.782, 9.492, 9.505, 8.421, 2.989, 2.316, 1.737,, 1.737, Multiword + 524288, 0.781, 9.518, 9.512, 8.429, 3.003, 2.249, 1.737,, 1.737, Multiword + 1048576, 0.797, 9.550, 9.540, 8.462, 3.033, 2.182, 1.741,, 1.741, Multiword + 2097152, 0.781, 9.576, 9.559, 8.481, 3.052, 2.176, 1.766,, 1.766, Multiword + 4194304, 0.797, 9.624, 9.639, 8.519, 3.064, 2.175, 1.771,, 1.771, Multiword + 8388608, 0.913, 9.867, 9.785, 8.734, 3.186, 2.290, 1.878,, 1.878, Multiword + 16777216, 0.911, 9.877, 9.866, 8.763, 3.192, 2.296, 1.887,, 1.887, Multiword + 33554432, 0.919, 9.880, 9.868, 8.765, 3.195, 2.303, 1.890,, 1.890, Multiword + 67108864, 0.916, 9.876, 9.873, 8.778, 3.196, 2.301, 1.893,, 1.893, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 3, 0, 66736, 1083447 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 12.107, 10.316,, 10.316, Multiword + 8, 5.252, 4.667,, 4.667, Multiword + 16, 3.848, 3.403,, 3.403, Multiword + 32, 3.219, 2.886,, 2.886, Multiword + 64, 2.800, 2.470,, 2.470, Multiword + 128, 2.631, 2.053,, 2.053, Multiword + 256, 2.541, 1.867,, 1.867, Multiword + 512, 2.525, 1.809,, 1.809, Multiword + 1024, 2.753, 1.899,, 1.899, Multiword + 2048, 2.922, 1.903,, 1.903, Multiword + 4096, 2.822, 1.845,, 1.845, Multiword + 8192, 2.906, 1.808,, 1.808, Multiword + 16384, 2.967, 1.823,, 1.823, Multiword + 32768, 2.967, 1.816,, 1.816, Multiword + 65536, 2.890, 1.814,, 1.814, Multiword + 131072, 2.653, 1.814,, 1.814, Multiword + 262144, 2.385, 1.805,, 1.805, Multiword + 524288, 2.247, 1.814,, 1.814, Multiword + 1048576, 2.221, 1.833,, 1.833, Multiword + 2097152, 2.203, 1.839,, 1.839, Multiword + 4194304, 2.205, 1.840,, 1.840, Multiword + 8388608, 2.313, 1.961,, 1.961, Multiword + 16777216, 2.314, 1.970,, 1.970, Multiword + 33554432, 2.315, 1.979,, 1.979, Multiword + 67108864, 2.313, 1.981,, 1.981, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 4, 0, 33968, 1020492 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 4.761, 9.089, 9.327, 9.260, 6.906, 9.585, 8.501,, 6.906, Word + 8, 2.750, 8.550, 8.589, 8.739, 5.095, 6.398, 5.794,, 5.095, Word + 16, 1.620, 9.000, 8.999, 8.069, 4.314, 4.885, 4.829,, 4.314, Word + 32, 1.125, 9.222, 9.230, 8.076, 4.018, 4.219, 3.593,, 3.593, Multiword + 64, 0.940, 9.329, 9.323, 8.300, 3.954, 4.045, 2.824,, 2.824, Multiword + 128, 0.870, 9.672, 9.378, 8.326, 3.840, 3.914, 2.484,, 2.484, Multiword + 256, 0.832, 9.568, 9.389, 8.337, 3.825, 3.987, 2.293,, 2.293, Multiword + 512, 0.814, 9.516, 9.455, 8.355, 3.856, 3.972, 2.219,, 2.219, Multiword + 1024, 0.806, 9.483, 9.447, 8.348, 3.847, 3.913, 2.184,, 2.184, Multiword + 2048, 0.812, 9.474, 9.434, 8.360, 3.842, 3.705, 2.167,, 2.167, Multiword + 4096, 0.804, 9.458, 9.390, 8.360, 3.893, 3.949, 2.129,, 2.129, Multiword + 8192, 0.801, 9.458, 9.422, 8.366, 3.843, 3.677, 2.144,, 2.144, Multiword + 16384, 0.799, 9.446, 9.361, 8.308, 3.861, 3.718, 2.148,, 2.148, Multiword + 32768, 0.799, 9.435, 9.396, 8.336, 3.848, 3.745, 2.157,, 2.157, Multiword + 65536, 0.796, 9.434, 9.379, 8.360, 3.858, 3.010, 2.158,, 2.158, Multiword + 131072, 0.796, 9.451, 9.386, 8.358, 3.857, 2.759, 2.160,, 2.160, Multiword + 262144, 0.796, 9.480, 9.500, 8.411, 3.876, 2.636, 2.161,, 2.161, Multiword + 524288, 0.796, 9.542, 9.517, 8.445, 3.920, 2.574, 2.162,, 2.162, Multiword + 1048576, 0.796, 9.555, 9.545, 8.458, 3.923, 2.470, 2.179,, 2.179, Multiword + 2097152, 0.796, 9.575, 9.573, 8.479, 3.969, 2.457, 2.183,, 2.183, Multiword + 4194304, 0.807, 9.612, 9.620, 8.520, 4.052, 2.457, 2.195,, 2.195, Multiword + 8388608, 0.904, 9.856, 9.859, 8.750, 4.242, 2.539, 2.317,, 2.317, Multiword + 16777216, 0.908, 9.861, 9.862, 8.765, 4.262, 2.589, 2.326,, 2.326, Multiword + 33554432, 0.909, 9.874, 9.873, 8.761, 4.307, 2.591, 2.328,, 2.328, Multiword + 67108864, 0.912, 9.875, 9.875, 8.769, 4.277, 2.593, 2.333,, 2.333, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 3, 0, 33968, 1007226 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 9.259, 7.651,, 7.651, Multiword + 8, 6.145, 5.478,, 5.478, Multiword + 16, 4.896, 4.501,, 4.501, Multiword + 32, 4.313, 3.761,, 3.761, Multiword + 64, 4.023, 2.782,, 2.782, Multiword + 128, 3.872, 2.528,, 2.528, Multiword + 256, 3.922, 2.327,, 2.327, Multiword + 512, 3.838, 2.234,, 2.234, Multiword + 1024, 3.956, 2.197,, 2.197, Multiword + 2048, 4.092, 2.178,, 2.178, Multiword + 4096, 4.000, 2.110,, 2.110, Multiword + 8192, 3.940, 2.124,, 2.124, Multiword + 16384, 3.672, 2.135,, 2.135, Multiword + 32768, 3.742, 2.155,, 2.155, Multiword + 65536, 3.447, 2.158,, 2.158, Multiword + 131072, 3.199, 2.159,, 2.159, Multiword + 262144, 2.821, 2.158,, 2.158, Multiword + 524288, 2.622, 2.159,, 2.159, Multiword + 1048576, 2.597, 2.173,, 2.173, Multiword + 2097152, 2.568, 2.182,, 2.182, Multiword + 4194304, 2.567, 2.193,, 2.193, Multiword + 8388608, 2.683, 2.321,, 2.321, Multiword + 16777216, 2.680, 2.328,, 2.328, Multiword + 33554432, 2.685, 2.324,, 2.324, Multiword + 67108864, 2.689, 2.332,, 2.332, Multiword + +ClassTitle, CRC-128-u128/u128/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 4, 0, 66736, 262791 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 9.001, 13.419, 16.982, 16.828, 14.598, 16.502, 16.251,, 13.419, Byte + 8, 3.751, 12.002, 13.741, 13.501, 6.127, 6.898, 6.855,, 6.127, Word + 16, 2.000, 11.202, 12.332, 12.626, 4.594, 5.087, 5.124,, 4.594, Word + 32, 1.125, 10.867, 11.957, 11.804, 3.794, 4.214, 4.231,, 3.794, Word + 64, 0.644, 10.595, 11.493, 12.657, 3.454, 3.738, 3.985,, 3.454, Word + 128, 0.423, 10.680, 11.304, 12.328, 3.324, 3.482, 3.493,, 3.324, Word + 256, 0.320, 10.562, 11.168, 12.184, 3.217, 3.393, 3.258,, 3.217, Word + 512, 0.265, 10.498, 11.176, 12.129, 3.200, 3.337, 3.229,, 3.200, Word + 1024, 0.247, 10.464, 11.135, 12.094, 3.396, 3.603, 3.305,, 3.305, Multiword + 2048, 0.233, 10.449, 11.113, 12.087, 3.555, 3.737, 3.321,, 3.321, Multiword + 4096, 0.232, 10.430, 11.093, 12.090, 3.534, 3.698, 3.230,, 3.230, Multiword + 8192, 0.225, 10.429, 11.091, 12.091, 3.583, 3.743, 3.204,, 3.204, Multiword + 16384, 0.225, 10.408, 10.851, 12.088, 3.621, 3.792, 3.220,, 3.220, Multiword + 32768, 0.229, 10.446, 11.045, 12.090, 3.635, 3.785, 3.220,, 3.220, Multiword + 65536, 0.258, 10.442, 10.962, 12.091, 3.634, 3.497, 3.217,, 3.217, Multiword + 131072, 0.258, 10.446, 10.973, 12.096, 3.643, 3.424, 3.211,, 3.211, Multiword + 262144, 0.258, 10.491, 10.956, 12.182, 3.665, 3.389, 3.214,, 3.214, Multiword + 524288, 0.257, 10.539, 11.076, 12.199, 3.703, 3.368, 3.215,, 3.215, Multiword + 1048576, 0.258, 10.573, 11.164, 12.230, 3.713, 3.352, 3.238,, 3.238, Multiword + 2097152, 0.260, 10.589, 11.204, 12.254, 3.733, 3.363, 3.251,, 3.251, Multiword + 4194304, 0.260, 10.638, 11.326, 12.356, 3.750, 3.376, 3.265,, 3.265, Multiword + 8388608, 0.534, 10.890, 11.538, 12.575, 3.896, 3.520, 3.408,, 3.408, Multiword + 16777216, 0.556, 10.863, 11.542, 12.602, 3.887, 3.528, 3.427,, 3.427, Multiword + 33554432, 0.556, 10.918, 11.550, 12.598, 3.895, 3.539, 3.429,, 3.429, Multiword + 67108864, 0.566, 10.895, 11.566, 12.617, 3.902, 3.537, 3.419,, 3.419, Multiword + +ClassTitle, CRC-128-u128/u128/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 3, 0, 66736, 252585 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 16.251, 16.335,, 16.251, Blockword + 8, 6.751, 6.506,, 6.506, Multiword + 16, 5.027, 4.876,, 4.876, Multiword + 32, 4.119, 4.181,, 4.119, Blockword + 64, 3.705, 3.938,, 3.705, Blockword + 128, 3.483, 3.227,, 3.227, Multiword + 256, 3.388, 3.020,, 3.020, Multiword + 512, 3.336, 2.952,, 2.952, Multiword + 1024, 3.582, 3.057,, 3.057, Multiword + 2048, 3.781, 3.072,, 3.072, Multiword + 4096, 3.673, 2.999,, 2.999, Multiword + 8192, 3.754, 2.962,, 2.962, Multiword + 16384, 3.785, 3.001,, 3.001, Multiword + 32768, 3.791, 2.999,, 2.999, Multiword + 65536, 3.688, 2.996,, 2.996, Multiword + 131072, 3.623, 2.990,, 2.990, Multiword + 262144, 3.521, 2.991,, 2.991, Multiword + 524288, 3.465, 2.993,, 2.993, Multiword + 1048576, 3.484, 3.017,, 3.017, Multiword + 2097152, 3.479, 3.031,, 3.031, Multiword + 4194304, 3.492, 3.046,, 3.046, Multiword + 8388608, 3.634, 3.193,, 3.193, Multiword + 16777216, 3.640, 3.196,, 3.196, Multiword + 33554432, 3.651, 3.175,, 3.175, Multiword + 67108864, 3.657, 3.205,, 3.205, Multiword + +ClassTitle, CRC-128-u128/u128/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 4, 0, 33968, 236781 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.751, 13.230, 16.787, 16.753, 12.003, 12.069, 11.627,, 11.627, Multiword + 8, 3.626, 12.158, 14.033, 13.368, 8.060, 8.269, 8.207,, 8.060, Word + 16, 1.813, 11.208, 12.362, 12.500, 6.669, 6.660, 6.585,, 6.585, Multiword + 32, 1.000, 10.867, 11.924, 11.715, 5.734, 5.857, 6.656,, 5.734, Word + 64, 0.594, 10.594, 11.492, 12.657, 5.322, 5.450, 5.500,, 5.322, Word + 128, 0.391, 10.680, 11.312, 12.405, 5.115, 5.236, 4.930,, 4.930, Multiword + 256, 0.303, 10.562, 11.168, 12.217, 4.962, 5.129, 4.750,, 4.750, Multiword + 512, 0.278, 10.499, 11.176, 12.129, 4.955, 5.053, 4.604,, 4.604, Multiword + 1024, 0.264, 10.467, 11.135, 12.120, 4.926, 5.073, 4.540,, 4.540, Multiword + 2048, 0.265, 10.447, 11.116, 12.102, 4.924, 5.076, 4.505,, 4.505, Multiword + 4096, 0.258, 10.434, 11.100, 12.102, 4.928, 5.044, 4.481,, 4.481, Multiword + 8192, 0.254, 10.433, 11.090, 12.098, 4.886, 5.041, 4.480,, 4.480, Multiword + 16384, 0.252, 10.307, 10.859, 12.095, 4.896, 5.038, 4.494,, 4.494, Multiword + 32768, 0.260, 10.427, 11.031, 12.089, 4.895, 5.038, 4.507,, 4.507, Multiword + 65536, 0.308, 10.324, 11.002, 12.089, 4.900, 4.065, 4.508,, 4.065, Blockword + 131072, 0.308, 10.446, 10.981, 12.096, 4.902, 3.993, 4.519,, 3.993, Blockword + 262144, 0.308, 10.492, 11.044, 12.153, 4.907, 3.957, 4.513,, 3.957, Blockword + 524288, 0.308, 10.539, 11.151, 12.224, 4.952, 3.970, 4.551,, 3.970, Blockword + 1048576, 0.309, 10.561, 11.141, 12.231, 4.982, 3.893, 4.563,, 3.893, Blockword + 2097152, 0.312, 10.591, 11.232, 12.254, 4.975, 3.902, 4.577,, 3.902, Blockword + 4194304, 0.312, 10.679, 11.333, 12.355, 5.007, 3.910, 4.600,, 3.910, Blockword + 8388608, 0.542, 10.913, 11.524, 12.587, 5.177, 4.064, 4.775,, 4.064, Blockword + 16777216, 0.546, 10.909, 11.536, 12.611, 5.176, 4.086, 4.777,, 4.086, Blockword + 33554432, 0.556, 10.909, 11.550, 12.608, 5.210, 4.086, 4.784,, 4.086, Blockword + 67108864, 0.554, 10.922, 11.556, 12.612, 5.203, 4.087, 4.790,, 4.087, Blockword + +ClassTitle, CRC-128-u128/u128/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 3, 0, 33968, 234432 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 12.069, 11.993,, 11.993, Multiword + 8, 8.269, 8.167,, 8.167, Multiword + 16, 6.660, 6.510,, 6.510, Multiword + 32, 5.846, 5.954,, 5.846, Blockword + 64, 5.448, 5.156,, 5.156, Multiword + 128, 5.235, 4.819,, 4.819, Multiword + 256, 5.096, 4.669,, 4.669, Multiword + 512, 5.053, 4.595,, 4.595, Multiword + 1024, 5.074, 4.548,, 4.548, Multiword + 2048, 5.088, 4.537,, 4.537, Multiword + 4096, 5.044, 4.517,, 4.517, Multiword + 8192, 5.041, 4.514,, 4.514, Multiword + 16384, 5.035, 4.519,, 4.519, Multiword + 32768, 5.038, 4.522,, 4.522, Multiword + 65536, 4.364, 4.520,, 4.364, Blockword + 131072, 4.285, 4.521,, 4.285, Blockword + 262144, 4.039, 4.520,, 4.039, Blockword + 524288, 3.934, 4.532,, 3.934, Blockword + 1048576, 3.939, 4.567,, 3.939, Blockword + 2097152, 3.926, 4.575,, 3.926, Blockword + 4194304, 3.932, 4.604,, 3.932, Blockword + 8388608, 4.081, 4.777,, 4.081, Blockword + 16777216, 4.042, 4.785,, 4.042, Blockword + 33554432, 4.092, 4.790,, 4.092, Blockword + 67108864, 4.097, 4.790,, 4.097, Blockword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 64, 8, 8, 8, 4, 0, 33408, 89388 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.232, 6.192, 7.112, 6.661, 8.257, 10.502, 7.726,, 6.192, Byte + 8, 2.560, 6.136, 6.595, 5.317, 4.064, 4.761, 3.228,, 3.228, Multiword + 16, 1.381, 6.751, 7.094, 5.761, 3.014, 3.444, 2.721,, 2.721, Multiword + 32, 0.828, 7.029, 7.395, 5.800, 2.485, 2.797, 2.433,, 2.433, Multiword + 64, 0.516, 7.219, 7.485, 5.975, 2.287, 2.446, 1.679,, 1.679, Multiword + 128, 0.372, 7.539, 7.601, 6.101, 2.153, 2.332, 1.404,, 1.404, Multiword + 256, 0.294, 7.461, 7.604, 6.127, 2.118, 2.276, 1.268,, 1.268, Multiword + 512, 0.258, 7.436, 7.678, 6.127, 2.076, 2.222, 1.201,, 1.201, Multiword + 1024, 0.239, 7.373, 7.661, 6.146, 2.060, 2.236, 1.167,, 1.167, Multiword + 2048, 0.230, 7.398, 7.638, 6.155, 2.063, 2.217, 1.151,, 1.151, Multiword + 4096, 0.230, 7.427, 7.633, 6.154, 2.064, 2.176, 1.145,, 1.145, Multiword + 8192, 0.225, 7.384, 7.629, 6.177, 2.058, 2.146, 1.147,, 1.147, Multiword + 16384, 0.224, 7.336, 7.627, 6.171, 2.062, 2.180, 1.152,, 1.152, Multiword + 32768, 0.229, 7.338, 7.627, 6.163, 2.062, 2.187, 1.170,, 1.170, Multiword + 65536, 0.258, 7.336, 7.626, 6.161, 2.064, 2.302, 1.173,, 1.173, Multiword + 131072, 0.258, 7.336, 7.626, 6.163, 2.065, 2.280, 1.172,, 1.172, Multiword + 262144, 0.258, 7.366, 7.654, 6.165, 2.065, 2.268, 1.172,, 1.172, Multiword + 524288, 0.258, 7.404, 7.678, 6.214, 2.066, 2.264, 1.172,, 1.172, Multiword + 1048576, 0.258, 7.412, 7.712, 6.237, 2.076, 2.286, 1.173,, 1.173, Multiword + 2097152, 0.260, 7.426, 7.724, 6.245, 2.080, 2.283, 1.186,, 1.186, Multiword + 4194304, 0.260, 7.473, 7.773, 6.293, 2.101, 2.294, 1.188,, 1.188, Multiword + 8388608, 0.534, 7.681, 7.975, 6.481, 2.223, 2.421, 1.295,, 1.295, Multiword + 16777216, 0.557, 7.697, 7.983, 6.492, 2.235, 2.432, 1.293,, 1.293, Multiword + 33554432, 0.558, 7.680, 7.997, 6.498, 2.243, 2.438, 1.302,, 1.302, Multiword + 67108864, 0.558, 7.714, 8.003, 6.501, 2.247, 2.440, 1.304,, 1.304, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 64, 8, 8, 8, 3, 0, 33408, 95526 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 10.165, 8.551,, 8.551, Multiword + 8, 4.756, 3.940,, 3.940, Multiword + 16, 3.419, 3.052,, 3.052, Multiword + 32, 2.794, 2.566,, 2.566, Multiword + 64, 2.504, 2.201,, 2.201, Multiword + 128, 2.337, 1.920,, 1.920, Multiword + 256, 2.258, 1.833,, 1.833, Multiword + 512, 2.232, 1.764,, 1.764, Multiword + 1024, 2.237, 1.761,, 1.761, Multiword + 2048, 2.213, 1.756,, 1.756, Multiword + 4096, 2.202, 1.736,, 1.736, Multiword + 8192, 2.197, 1.736,, 1.736, Multiword + 16384, 2.177, 1.745,, 1.745, Multiword + 32768, 2.198, 1.751,, 1.751, Multiword + 65536, 2.204, 1.752,, 1.752, Multiword + 131072, 2.178, 1.751,, 1.751, Multiword + 262144, 2.153, 1.751,, 1.751, Multiword + 524288, 2.144, 1.750,, 1.750, Multiword + 1048576, 2.164, 1.752,, 1.752, Multiword + 2097152, 2.160, 1.771,, 1.771, Multiword + 4194304, 2.168, 1.779,, 1.779, Multiword + 8388608, 2.296, 1.901,, 1.901, Multiword + 16777216, 2.300, 1.914,, 1.914, Multiword + 33554432, 2.301, 1.914,, 1.914, Multiword + 67108864, 2.311, 1.917,, 1.917, Multiword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 8, 8, 8, 4, 0, 33408, 1196946 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.229, 6.188, 7.108, 6.660, 8.265, 10.610, 7.743, 9.713,, 6.188, Byte + 8, 2.558, 6.132, 6.534, 5.269, 4.064, 4.760, 3.261, 4.044,, 3.261, Multiword + 16, 1.379, 6.751, 7.094, 5.761, 3.011, 3.444, 2.721, 3.014,, 2.721, Multiword + 32, 0.830, 7.069, 7.398, 5.802, 2.563, 2.798, 2.433, 2.375,, 2.375, CRC32C + 64, 0.516, 7.233, 7.485, 5.975, 2.287, 2.459, 1.678, 2.115,, 1.678, Multiword + 128, 0.372, 7.539, 7.568, 6.092, 2.171, 2.332, 1.404, 2.143,, 1.404, Multiword + 256, 0.295, 7.461, 7.607, 6.127, 2.110, 2.276, 1.268, 2.081,, 1.268, Multiword + 512, 0.259, 7.436, 7.678, 6.127, 2.075, 2.221, 1.203, 2.398,, 1.203, Multiword + 1024, 0.240, 7.373, 7.656, 6.152, 2.070, 2.234, 1.167, 2.182,, 1.167, Multiword + 2048, 0.229, 7.398, 7.639, 6.154, 2.063, 2.216, 1.151, 2.176,, 1.151, Multiword + 4096, 0.229, 7.431, 7.633, 6.154, 2.064, 2.203, 1.145, 2.251,, 1.145, Multiword + 8192, 0.226, 7.384, 7.629, 6.176, 2.058, 2.203, 1.147, 2.240,, 1.147, Multiword + 16384, 0.224, 7.336, 7.634, 6.171, 2.061, 2.189, 1.157, 2.247,, 1.157, Multiword + 32768, 0.229, 7.335, 7.627, 6.165, 2.062, 2.190, 1.171, 2.253,, 1.171, Multiword + 65536, 0.258, 7.336, 7.626, 6.161, 2.064, 2.260, 1.173, 2.256,, 1.173, Multiword + 131072, 0.258, 7.335, 7.626, 6.163, 2.063, 2.248, 1.172, 2.258,, 1.172, Multiword + 262144, 0.258, 7.355, 7.652, 6.165, 2.066, 2.244, 1.172, 2.258,, 1.172, Multiword + 524288, 0.258, 7.417, 7.686, 6.216, 2.066, 2.242, 1.172, 2.260,, 1.172, Multiword + 1048576, 0.258, 7.417, 7.706, 6.239, 2.076, 2.262, 1.173, 2.277,, 1.173, Multiword + 2097152, 0.260, 7.430, 7.716, 6.249, 2.090, 2.268, 1.186, 2.284,, 1.186, Multiword + 4194304, 0.260, 7.496, 7.779, 6.271, 2.097, 2.276, 1.188, 2.292,, 1.188, Multiword + 8388608, 0.538, 7.689, 7.975, 6.479, 2.224, 2.407, 1.295, 2.440,, 1.295, Multiword + 16777216, 0.553, 7.600, 7.994, 6.480, 2.232, 2.407, 1.294, 2.445,, 1.294, Multiword + 33554432, 0.553, 7.701, 7.987, 6.497, 2.244, 2.420, 1.299, 2.451,, 1.299, Multiword + 67108864, 0.558, 7.711, 7.997, 6.499, 2.247, 2.422, 1.302, 2.454,, 1.302, Multiword + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 8, 8, 8, 3, 0, 33408, 1201599 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 10.501, 8.551, 9.630,, 8.551, Multiword + 8, 4.756, 3.982, 4.044,, 3.982, Multiword + 16, 3.423, 3.063, 3.001,, 3.001, CRC32C + 32, 2.794, 2.595, 2.377,, 2.377, CRC32C + 64, 2.503, 2.189, 2.115,, 2.115, CRC32C + 128, 2.338, 1.920, 2.142,, 1.920, Multiword + 256, 2.254, 1.834, 2.062,, 1.834, Multiword + 512, 2.232, 1.771, 2.418,, 1.771, Multiword + 1024, 2.227, 1.742, 2.182,, 1.742, Multiword + 2048, 2.213, 1.744, 2.176,, 1.744, Multiword + 4096, 2.208, 1.742, 2.248,, 1.742, Multiword + 8192, 2.206, 1.738, 2.240,, 1.738, Multiword + 16384, 2.185, 1.747, 2.245,, 1.747, Multiword + 32768, 2.193, 1.750, 2.254,, 1.750, Multiword + 65536, 2.164, 1.753, 2.256,, 1.753, Multiword + 131072, 2.153, 1.752, 2.259,, 1.752, Multiword + 262144, 2.134, 1.751, 2.258,, 1.751, Multiword + 524288, 2.125, 1.751, 2.261,, 1.751, Multiword + 1048576, 2.143, 1.753, 2.282,, 1.753, Multiword + 2097152, 2.147, 1.776, 2.281,, 1.776, Multiword + 4194304, 2.152, 1.778, 2.292,, 1.778, Multiword + 8388608, 2.277, 1.896, 2.440,, 1.896, Multiword + 16777216, 2.284, 1.908, 2.450,, 1.908, Multiword + 33554432, 2.293, 1.910, 2.452,, 1.910, Multiword + 67108864, 2.291, 1.918, 2.453,, 1.918, Multiword + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 4, 4, 4, 4, 0, 8544, 1187748 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 3.251, 6.191, 6.979, 6.170, 5.251, 7.502, 6.512, 9.451,, 5.251, Word + 8, 1.875, 6.140, 6.620, 5.605, 3.756, 4.890, 4.251, 4.211,, 3.756, Word + 16, 1.125, 6.751, 7.043, 5.502, 3.027, 3.646, 3.498, 3.046,, 3.027, Word + 32, 0.656, 7.042, 7.414, 5.817, 2.956, 3.332, 2.516, 2.417,, 2.417, CRC32C + 64, 0.422, 7.219, 7.487, 6.083, 2.863, 3.047, 2.032, 2.281,, 2.032, Multiword + 128, 0.324, 7.539, 7.572, 6.137, 2.833, 2.919, 1.736, 2.141,, 1.736, Multiword + 256, 0.287, 7.461, 7.595, 6.167, 2.825, 2.870, 1.678, 2.100,, 1.678, Multiword + 512, 0.268, 7.436, 7.689, 6.177, 2.811, 2.962, 1.616, 2.380,, 1.616, Multiword + 1024, 0.260, 7.373, 7.658, 6.180, 2.824, 2.852, 1.595, 2.208,, 1.595, Multiword + 2048, 0.264, 7.398, 7.649, 6.202, 2.838, 2.838, 1.593, 2.182,, 1.593, Multiword + 4096, 0.257, 7.423, 7.636, 6.208, 2.853, 2.830, 1.578, 2.235,, 1.578, Multiword + 8192, 0.254, 7.383, 7.655, 6.187, 2.842, 2.824, 1.571, 2.233,, 1.571, Multiword + 16384, 0.252, 7.336, 7.627, 6.213, 2.823, 2.716, 1.568, 2.241,, 1.568, Multiword + 32768, 0.259, 7.336, 7.640, 6.198, 2.807, 2.806, 1.577, 2.257,, 1.577, Multiword + 65536, 0.308, 7.336, 7.626, 6.194, 2.809, 1.819, 1.580, 2.260,, 1.580, Multiword + 131072, 0.308, 7.336, 7.610, 6.200, 2.805, 1.805, 1.581, 2.259,, 1.581, Multiword + 262144, 0.308, 7.369, 7.657, 6.202, 2.810, 1.800, 1.582, 2.259,, 1.582, Multiword + 524288, 0.309, 7.395, 7.681, 6.263, 2.813, 1.798, 1.581, 2.258,, 1.581, Multiword + 1048576, 0.309, 7.423, 7.708, 6.271, 2.830, 1.738, 1.583, 2.282,, 1.583, Multiword + 2097152, 0.312, 7.430, 7.718, 6.301, 2.860, 1.758, 1.596, 2.288,, 1.596, Multiword + 4194304, 0.312, 7.470, 7.772, 6.327, 2.878, 1.757, 1.601, 2.295,, 1.601, Multiword + 8388608, 0.550, 7.671, 7.986, 6.425, 3.027, 1.879, 1.712, 2.429,, 1.712, Multiword + 16777216, 0.554, 7.699, 7.980, 6.544, 3.026, 1.888, 1.724, 2.445,, 1.724, Multiword + 33554432, 0.557, 7.701, 8.000, 6.546, 3.013, 1.886, 1.726, 2.448,, 1.726, Multiword + 67108864, 0.553, 7.715, 8.005, 6.553, 3.050, 1.889, 1.727, 2.451,, 1.727, Multiword + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 4, 4, 4, 3, 0, 8544, 1182339 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 7.850, 6.712, 9.448,, 6.712, Multiword + 8, 4.973, 4.304, 4.211,, 4.211, CRC32C + 16, 3.824, 3.571, 3.453,, 3.453, CRC32C + 32, 3.415, 2.563, 2.611,, 2.563, Multiword + 64, 3.196, 1.914, 2.276,, 1.914, Multiword + 128, 3.090, 1.702, 2.137,, 1.702, Multiword + 256, 3.070, 1.539, 2.046,, 1.539, Multiword + 512, 3.093, 1.484, 2.380,, 1.484, Multiword + 1024, 3.026, 1.455, 2.207,, 1.455, Multiword + 2048, 3.010, 1.436, 2.186,, 1.436, Multiword + 4096, 2.999, 1.419, 2.233,, 1.419, Multiword + 8192, 2.994, 1.418, 2.231,, 1.418, Multiword + 16384, 2.991, 1.411, 2.242,, 1.411, Multiword + 32768, 2.991, 1.426, 2.259,, 1.426, Multiword + 65536, 2.340, 1.425, 2.260,, 1.425, Multiword + 131072, 2.332, 1.427, 2.259,, 1.427, Multiword + 262144, 2.142, 1.427, 2.260,, 1.427, Multiword + 524288, 2.057, 1.428, 2.258,, 1.428, Multiword + 1048576, 2.074, 1.429, 2.272,, 1.429, Multiword + 2097152, 2.056, 1.442, 2.285,, 1.442, Multiword + 4194304, 2.062, 1.448, 2.296,, 1.448, Multiword + 8388608, 2.184, 1.554, 2.442,, 1.554, Multiword + 16777216, 2.183, 1.556, 2.445,, 1.556, Multiword + 33554432, 2.185, 1.569, 2.448,, 1.569, Multiword + 67108864, 2.190, 1.567, 2.453,, 1.567, Multiword + diff --git a/crcutil-1.0/doc/data/test-gcc-64-noasm-1.csv b/crcutil-1.0/doc/data/test-gcc-64-noasm-1.csv new file mode 100644 index 0000000..0fdd258 --- /dev/null +++ b/crcutil-1.0/doc/data/test-gcc-64-noasm-1.csv @@ -0,0 +1,434 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 4, 0, 66736, 1114677 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.777, 9.090, 9.327, 9.257, 9.503, 12.251, 11.302,, 9.090, Byte + 8, 3.209, 8.601, 8.614, 8.695, 4.241, 5.419, 4.848,, 4.241, Word + 16, 1.890, 8.956, 8.997, 8.048, 3.368, 3.954, 3.551,, 3.368, Word + 32, 1.386, 9.223, 9.230, 8.212, 2.826, 3.211, 3.016,, 2.826, Word + 64, 1.110, 9.329, 9.323, 8.298, 2.645, 2.829, 2.485,, 2.485, Multiword + 128, 0.961, 9.672, 9.378, 8.326, 2.537, 2.659, 2.055,, 2.055, Multiword + 256, 0.881, 9.568, 9.389, 8.338, 2.451, 2.554, 1.833,, 1.833, Multiword + 512, 0.847, 9.516, 9.455, 8.356, 2.446, 2.505, 1.788,, 1.788, Multiword + 1024, 0.830, 9.483, 9.448, 8.352, 2.692, 2.758, 1.813,, 1.813, Multiword + 2048, 0.821, 9.474, 9.434, 8.360, 2.888, 2.931, 1.810,, 1.810, Multiword + 4096, 0.820, 9.455, 9.391, 8.360, 2.829, 2.835, 1.769,, 1.769, Multiword + 8192, 0.813, 9.460, 9.422, 8.366, 2.880, 2.878, 1.752,, 1.752, Multiword + 16384, 0.808, 9.446, 9.379, 8.308, 2.931, 2.969, 1.747,, 1.747, Multiword + 32768, 0.808, 9.451, 9.386, 8.344, 2.961, 2.961, 1.739,, 1.739, Multiword + 65536, 0.800, 9.451, 9.370, 8.324, 2.938, 2.681, 1.732,, 1.732, Multiword + 131072, 0.786, 9.451, 9.415, 8.358, 2.976, 2.432, 1.737,, 1.737, Multiword + 262144, 0.793, 9.540, 9.512, 8.405, 2.980, 2.303, 1.728,, 1.728, Multiword + 524288, 0.790, 9.541, 9.511, 8.449, 3.010, 2.244, 1.738,, 1.738, Multiword + 1048576, 0.797, 9.564, 9.550, 8.482, 3.033, 2.187, 1.762,, 1.762, Multiword + 2097152, 0.789, 9.568, 9.564, 8.479, 3.051, 2.175, 1.760,, 1.760, Multiword + 4194304, 0.803, 9.607, 9.603, 8.515, 3.060, 2.174, 1.768,, 1.768, Multiword + 8388608, 0.898, 9.853, 9.866, 8.760, 3.187, 2.286, 1.876,, 1.876, Multiword + 16777216, 0.915, 9.820, 9.865, 8.776, 3.200, 2.294, 1.882,, 1.882, Multiword + 33554432, 0.919, 9.876, 9.878, 8.739, 3.199, 2.297, 1.879,, 1.879, Multiword + 67108864, 0.924, 9.888, 9.844, 8.788, 3.203, 2.300, 1.886,, 1.886, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 3, 0, 66736, 1077048 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 12.135, 10.314,, 10.314, Multiword + 8, 5.314, 4.189,, 4.189, Multiword + 16, 3.884, 3.355,, 3.355, Multiword + 32, 3.063, 2.895,, 2.895, Multiword + 64, 2.758, 2.470,, 2.470, Multiword + 128, 2.610, 2.053,, 2.053, Multiword + 256, 2.530, 1.869,, 1.869, Multiword + 512, 2.482, 1.827,, 1.827, Multiword + 1024, 2.691, 1.898,, 1.898, Multiword + 2048, 2.926, 1.913,, 1.913, Multiword + 4096, 2.848, 1.847,, 1.847, Multiword + 8192, 2.871, 1.808,, 1.808, Multiword + 16384, 2.942, 1.824,, 1.824, Multiword + 32768, 2.959, 1.816,, 1.816, Multiword + 65536, 2.888, 1.818,, 1.818, Multiword + 131072, 2.637, 1.813,, 1.813, Multiword + 262144, 2.371, 1.812,, 1.812, Multiword + 524288, 2.240, 1.815,, 1.815, Multiword + 1048576, 2.236, 1.820,, 1.820, Multiword + 2097152, 2.204, 1.839,, 1.839, Multiword + 4194304, 2.203, 1.845,, 1.845, Multiword + 8388608, 2.307, 1.967,, 1.967, Multiword + 16777216, 2.307, 1.972,, 1.972, Multiword + 33554432, 2.321, 1.978,, 1.978, Multiword + 67108864, 2.322, 1.976,, 1.976, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 4, 0, 33968, 1012923 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 4.762, 9.090, 9.327, 9.254, 6.907, 9.587, 8.501,, 6.907, Word + 8, 2.751, 8.603, 8.644, 8.739, 5.139, 6.410, 5.794,, 5.139, Word + 16, 1.622, 9.000, 8.997, 8.080, 4.314, 4.788, 4.843,, 4.314, Word + 32, 1.125, 9.222, 9.230, 8.087, 4.071, 4.219, 3.544,, 3.544, Multiword + 64, 0.940, 9.329, 9.323, 8.296, 3.954, 4.046, 2.815,, 2.815, Multiword + 128, 0.870, 9.672, 9.378, 8.326, 3.840, 3.936, 2.473,, 2.473, Multiword + 256, 0.832, 9.568, 9.389, 8.337, 3.826, 3.987, 2.292,, 2.292, Multiword + 512, 0.814, 9.516, 9.455, 8.358, 3.856, 3.972, 2.221,, 2.221, Multiword + 1024, 0.806, 9.483, 9.448, 8.349, 3.847, 3.913, 2.182,, 2.182, Multiword + 2048, 0.812, 9.474, 9.435, 8.360, 3.842, 3.705, 2.167,, 2.167, Multiword + 4096, 0.804, 9.458, 9.390, 8.360, 3.891, 3.950, 2.150,, 2.150, Multiword + 8192, 0.801, 9.457, 9.418, 8.366, 3.843, 3.677, 2.141,, 2.141, Multiword + 16384, 0.799, 9.449, 9.363, 8.308, 3.853, 3.677, 2.154,, 2.154, Multiword + 32768, 0.798, 9.422, 9.386, 8.351, 3.816, 3.826, 2.159,, 2.159, Multiword + 65536, 0.785, 9.384, 9.386, 8.324, 3.854, 3.005, 2.162,, 2.162, Multiword + 131072, 0.796, 9.392, 9.413, 8.358, 3.855, 2.754, 2.157,, 2.157, Multiword + 262144, 0.796, 9.496, 9.508, 8.398, 3.875, 2.629, 2.162,, 2.162, Multiword + 524288, 0.796, 9.528, 9.512, 8.447, 3.921, 2.552, 2.162,, 2.162, Multiword + 1048576, 0.796, 9.562, 9.543, 8.461, 3.938, 2.469, 2.185,, 2.185, Multiword + 2097152, 0.805, 9.579, 9.564, 8.477, 4.002, 2.457, 2.188,, 2.188, Multiword + 4194304, 0.803, 9.603, 9.613, 8.525, 4.078, 2.461, 2.195,, 2.195, Multiword + 8388608, 0.909, 9.852, 9.858, 8.755, 4.266, 2.579, 2.321,, 2.321, Multiword + 16777216, 0.908, 9.770, 9.865, 8.761, 4.301, 2.594, 2.324,, 2.324, Multiword + 33554432, 0.906, 9.876, 9.873, 8.730, 4.318, 2.596, 2.332,, 2.332, Multiword + 67108864, 0.911, 9.882, 9.855, 8.782, 4.317, 2.586, 2.332,, 2.332, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 3, 0, 33968, 997623 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 9.264, 7.827,, 7.827, Multiword + 8, 6.227, 5.517,, 5.517, Multiword + 16, 4.896, 4.501,, 4.501, Multiword + 32, 4.313, 3.761,, 3.761, Multiword + 64, 4.008, 2.786,, 2.786, Multiword + 128, 3.871, 2.528,, 2.528, Multiword + 256, 3.922, 2.323,, 2.323, Multiword + 512, 3.838, 2.233,, 2.233, Multiword + 1024, 3.957, 2.197,, 2.197, Multiword + 2048, 4.092, 2.173,, 2.173, Multiword + 4096, 4.000, 2.142,, 2.142, Multiword + 8192, 3.950, 2.143,, 2.143, Multiword + 16384, 3.712, 2.135,, 2.135, Multiword + 32768, 3.738, 2.158,, 2.158, Multiword + 65536, 3.442, 2.158,, 2.158, Multiword + 131072, 3.171, 2.159,, 2.159, Multiword + 262144, 2.821, 2.159,, 2.159, Multiword + 524288, 2.623, 2.158,, 2.158, Multiword + 1048576, 2.610, 2.177,, 2.177, Multiword + 2097152, 2.562, 2.184,, 2.184, Multiword + 4194304, 2.570, 2.191,, 2.191, Multiword + 8388608, 2.690, 2.320,, 2.320, Multiword + 16777216, 2.681, 2.326,, 2.326, Multiword + 33554432, 2.684, 2.332,, 2.332, Multiword + 67108864, 2.696, 2.338,, 2.338, Multiword + +ClassTitle, CRC-128-u128/u128/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 4, 0, 66736, 263376 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 9.001, 13.278, 17.014, 16.939, 14.533, 16.501, 16.252,, 13.278, Byte + 8, 3.751, 12.126, 13.881, 13.501, 6.139, 6.756, 6.855,, 6.139, Word + 16, 2.000, 11.204, 12.330, 12.671, 4.504, 5.028, 5.127,, 4.504, Word + 32, 1.130, 10.867, 11.936, 11.790, 3.794, 4.165, 4.158,, 3.794, Word + 64, 0.641, 10.595, 11.491, 12.657, 3.454, 3.715, 3.985,, 3.454, Word + 128, 0.421, 10.680, 11.304, 12.405, 3.244, 3.493, 3.578,, 3.244, Word + 256, 0.321, 10.562, 11.168, 12.217, 3.230, 3.390, 3.278,, 3.230, Word + 512, 0.271, 10.499, 11.176, 12.129, 3.200, 3.356, 3.241,, 3.200, Word + 1024, 0.245, 10.464, 11.136, 12.120, 3.390, 3.609, 3.285,, 3.285, Multiword + 2048, 0.233, 10.449, 11.116, 12.102, 3.528, 3.713, 3.311,, 3.311, Multiword + 4096, 0.236, 10.434, 11.097, 12.102, 3.521, 3.682, 3.230,, 3.230, Multiword + 8192, 0.227, 10.434, 11.086, 12.100, 3.603, 3.753, 3.208,, 3.208, Multiword + 16384, 0.224, 10.387, 10.919, 12.092, 3.633, 3.802, 3.214,, 3.214, Multiword + 32768, 0.229, 10.404, 11.007, 12.089, 3.641, 3.786, 3.214,, 3.214, Multiword + 65536, 0.258, 10.445, 10.987, 12.090, 3.631, 3.506, 3.210,, 3.210, Multiword + 131072, 0.258, 10.446, 10.986, 12.094, 3.656, 3.433, 3.207,, 3.207, Multiword + 262144, 0.258, 10.503, 11.027, 12.184, 3.664, 3.396, 3.208,, 3.208, Multiword + 524288, 0.258, 10.539, 11.131, 12.191, 3.668, 3.377, 3.210,, 3.210, Multiword + 1048576, 0.258, 10.565, 11.158, 12.230, 3.724, 3.358, 3.234,, 3.234, Multiword + 2097152, 0.260, 10.579, 11.181, 12.255, 3.737, 3.369, 3.249,, 3.249, Multiword + 4194304, 0.260, 10.628, 11.292, 12.315, 3.747, 3.368, 3.269,, 3.269, Multiword + 8388608, 0.533, 10.772, 11.522, 12.591, 3.895, 3.530, 3.409,, 3.409, Multiword + 16777216, 0.556, 10.912, 11.532, 12.613, 3.903, 3.539, 3.415,, 3.415, Multiword + 33554432, 0.556, 10.921, 11.531, 12.608, 3.903, 3.537, 3.423,, 3.423, Multiword + 67108864, 0.562, 10.908, 11.563, 12.592, 3.903, 3.542, 3.431,, 3.431, Multiword + +ClassTitle, CRC-128-u128/u128/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 8, 3, 0, 66736, 251253 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 16.251, 16.044,, 16.044, Multiword + 8, 6.751, 6.530,, 6.530, Multiword + 16, 5.027, 4.876,, 4.876, Multiword + 32, 4.119, 4.074,, 4.074, Multiword + 64, 3.704, 3.938,, 3.704, Blockword + 128, 3.490, 3.227,, 3.227, Multiword + 256, 3.388, 3.037,, 3.037, Multiword + 512, 3.336, 2.953,, 2.953, Multiword + 1024, 3.597, 3.065,, 3.065, Multiword + 2048, 3.753, 3.078,, 3.078, Multiword + 4096, 3.691, 2.997,, 2.997, Multiword + 8192, 3.731, 2.962,, 2.962, Multiword + 16384, 3.763, 3.002,, 3.002, Multiword + 32768, 3.769, 2.998,, 2.998, Multiword + 65536, 3.680, 2.995,, 2.995, Multiword + 131072, 3.610, 2.991,, 2.991, Multiword + 262144, 3.512, 2.991,, 2.991, Multiword + 524288, 3.464, 2.994,, 2.994, Multiword + 1048576, 3.477, 3.017,, 3.017, Multiword + 2097152, 3.479, 3.028,, 3.028, Multiword + 4194304, 3.499, 3.040,, 3.040, Multiword + 8388608, 3.641, 3.187,, 3.187, Multiword + 16777216, 3.642, 3.198,, 3.198, Multiword + 33554432, 3.651, 3.203,, 3.203, Multiword + 67108864, 3.648, 3.208,, 3.208, Multiword + +ClassTitle, CRC-128-u128/u128/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 4, 0, 33968, 236997 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.751, 13.313, 16.871, 16.801, 12.064, 12.128, 12.005,, 12.005, Multiword + 8, 3.626, 11.997, 13.934, 13.391, 8.076, 8.269, 8.200,, 8.076, Word + 16, 1.813, 11.201, 12.343, 12.603, 6.727, 6.660, 6.582,, 6.582, Multiword + 32, 1.000, 10.867, 11.886, 11.746, 5.789, 5.842, 6.407,, 5.789, Word + 64, 0.594, 10.595, 11.494, 12.657, 5.366, 5.448, 5.500,, 5.366, Word + 128, 0.391, 10.680, 11.311, 12.405, 5.160, 5.239, 4.907,, 4.907, Multiword + 256, 0.303, 10.562, 11.168, 12.217, 4.974, 5.129, 4.735,, 4.735, Multiword + 512, 0.277, 10.499, 11.176, 12.129, 4.955, 5.053, 4.607,, 4.607, Multiword + 1024, 0.263, 10.464, 11.134, 12.120, 4.926, 5.073, 4.524,, 4.524, Multiword + 2048, 0.265, 10.449, 11.108, 12.102, 4.950, 5.076, 4.505,, 4.505, Multiword + 4096, 0.258, 10.431, 11.093, 12.104, 4.940, 5.044, 4.479,, 4.479, Multiword + 8192, 0.254, 10.424, 11.088, 12.104, 4.887, 5.043, 4.483,, 4.483, Multiword + 16384, 0.252, 10.309, 10.853, 12.096, 4.902, 5.032, 4.498,, 4.498, Multiword + 32768, 0.260, 10.444, 11.033, 12.094, 4.900, 5.040, 4.511,, 4.511, Multiword + 65536, 0.308, 10.400, 11.011, 12.091, 4.903, 4.066, 4.512,, 4.066, Blockword + 131072, 0.308, 10.446, 10.911, 12.095, 4.901, 3.996, 4.510,, 3.996, Blockword + 262144, 0.308, 10.510, 11.072, 12.184, 4.906, 3.957, 4.520,, 3.957, Blockword + 524288, 0.309, 10.539, 11.126, 12.228, 4.953, 3.966, 4.547,, 3.966, Blockword + 1048576, 0.309, 10.561, 11.190, 12.234, 4.976, 3.903, 4.567,, 3.903, Blockword + 2097152, 0.312, 10.591, 11.226, 12.254, 4.974, 3.899, 4.580,, 3.899, Blockword + 4194304, 0.312, 10.630, 11.280, 12.301, 4.982, 3.912, 4.587,, 3.912, Blockword + 8388608, 0.549, 10.873, 11.528, 12.598, 5.191, 4.080, 4.775,, 4.080, Blockword + 16777216, 0.557, 10.909, 11.553, 12.619, 5.195, 4.087, 4.779,, 4.087, Blockword + 33554432, 0.557, 10.903, 11.557, 12.617, 5.195, 4.031, 4.787,, 4.031, Blockword + 67108864, 0.561, 10.926, 11.560, 12.622, 5.192, 4.091, 4.791,, 4.091, Blockword + +ClassTitle, CRC-128-u128/u128/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 128, 16, 16, 4, 3, 0, 33968, 234801 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 12.274, 12.002,, 12.002, Multiword + 8, 8.272, 8.167,, 8.167, Multiword + 16, 6.630, 6.494,, 6.494, Multiword + 32, 5.891, 6.063,, 5.891, Blockword + 64, 5.473, 5.188,, 5.188, Multiword + 128, 5.268, 4.907,, 4.907, Multiword + 256, 5.129, 4.676,, 4.676, Multiword + 512, 5.053, 4.602,, 4.602, Multiword + 1024, 5.074, 4.573,, 4.573, Multiword + 2048, 5.076, 4.527,, 4.527, Multiword + 4096, 4.953, 4.521,, 4.521, Multiword + 8192, 5.043, 4.516,, 4.516, Multiword + 16384, 5.040, 4.519,, 4.519, Multiword + 32768, 5.042, 4.520,, 4.520, Multiword + 65536, 4.361, 4.520,, 4.361, Blockword + 131072, 4.291, 4.520,, 4.291, Blockword + 262144, 4.040, 4.520,, 4.040, Blockword + 524288, 3.951, 4.552,, 3.951, Blockword + 1048576, 3.949, 4.566,, 3.949, Blockword + 2097152, 3.926, 4.577,, 3.926, Blockword + 4194304, 3.934, 4.601,, 3.934, Blockword + 8388608, 4.088, 4.764,, 4.088, Blockword + 16777216, 4.096, 4.789,, 4.096, Blockword + 33554432, 4.094, 4.795,, 4.094, Blockword + 67108864, 4.092, 4.787,, 4.092, Blockword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 64, 8, 8, 8, 4, 0, 33408, 89820 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.231, 6.188, 7.109, 7.001, 8.253, 10.006, 9.252,, 6.188, Byte + 8, 2.559, 6.140, 6.578, 5.390, 3.810, 4.760, 3.976,, 3.810, Word + 16, 1.376, 6.751, 7.094, 5.761, 3.002, 3.443, 2.938,, 2.938, Multiword + 32, 0.828, 7.033, 7.398, 5.807, 2.457, 2.797, 2.674,, 2.457, Word + 64, 0.517, 7.219, 7.485, 5.975, 2.287, 2.472, 2.307,, 2.287, Word + 128, 0.367, 7.539, 7.600, 6.102, 2.189, 2.332, 2.186,, 2.186, Multiword + 256, 0.294, 7.461, 7.604, 6.127, 2.119, 2.277, 2.092,, 2.092, Multiword + 512, 0.258, 7.436, 7.678, 6.127, 2.086, 2.222, 2.054,, 2.054, Multiword + 1024, 0.240, 7.373, 7.661, 6.151, 2.065, 2.223, 2.031,, 2.031, Multiword + 2048, 0.230, 7.398, 7.639, 6.154, 2.062, 2.217, 2.018,, 2.018, Multiword + 4096, 0.231, 7.434, 7.633, 6.154, 2.056, 2.208, 2.032,, 2.032, Multiword + 8192, 0.228, 7.383, 7.629, 6.177, 2.061, 2.191, 2.030,, 2.030, Multiword + 16384, 0.223, 7.336, 7.627, 6.171, 2.060, 2.177, 2.036,, 2.036, Multiword + 32768, 0.228, 7.337, 7.618, 6.166, 2.060, 2.195, 2.045,, 2.045, Multiword + 65536, 0.258, 7.336, 7.626, 6.161, 2.063, 2.307, 2.047,, 2.047, Multiword + 131072, 0.258, 7.335, 7.626, 6.163, 2.062, 2.281, 2.047,, 2.047, Multiword + 262144, 0.258, 7.353, 7.655, 6.165, 2.064, 2.268, 2.047,, 2.047, Multiword + 524288, 0.258, 7.386, 7.697, 6.216, 2.066, 2.263, 2.047,, 2.047, Multiword + 1048576, 0.258, 7.420, 7.717, 6.220, 2.089, 2.287, 2.069,, 2.069, Multiword + 2097152, 0.260, 7.430, 7.721, 6.247, 2.089, 2.288, 2.069,, 2.069, Multiword + 4194304, 0.260, 7.466, 7.762, 6.279, 2.099, 2.295, 2.074,, 2.074, Multiword + 8388608, 0.537, 7.677, 7.989, 6.457, 2.232, 2.427, 2.207,, 2.207, Multiword + 16777216, 0.558, 7.710, 7.994, 6.486, 2.234, 2.432, 2.224,, 2.224, Multiword + 33554432, 0.559, 7.710, 8.000, 6.492, 2.240, 2.420, 2.228,, 2.228, Multiword + 67108864, 0.565, 7.712, 7.997, 6.467, 2.245, 2.444, 2.223,, 2.223, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 64, 8, 8, 8, 3, 0, 33408, 96165 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 10.483, 9.160,, 9.160, Multiword + 8, 4.695, 3.965,, 3.965, Multiword + 16, 3.403, 3.053,, 3.053, Multiword + 32, 2.780, 2.594,, 2.594, Multiword + 64, 2.501, 2.191,, 2.191, Multiword + 128, 2.333, 1.920,, 1.920, Multiword + 256, 2.251, 1.833,, 1.833, Multiword + 512, 2.217, 1.764,, 1.764, Multiword + 1024, 2.212, 1.762,, 1.762, Multiword + 2048, 2.210, 1.747,, 1.747, Multiword + 4096, 2.174, 1.739,, 1.739, Multiword + 8192, 2.197, 1.738,, 1.738, Multiword + 16384, 2.184, 1.745,, 1.745, Multiword + 32768, 2.195, 1.750,, 1.750, Multiword + 65536, 2.212, 1.752,, 1.752, Multiword + 131072, 2.186, 1.750,, 1.750, Multiword + 262144, 2.164, 1.751,, 1.751, Multiword + 524288, 2.153, 1.750,, 1.750, Multiword + 1048576, 2.159, 1.752,, 1.752, Multiword + 2097152, 2.173, 1.767,, 1.767, Multiword + 4194304, 2.179, 1.776,, 1.776, Multiword + 8388608, 2.302, 1.906,, 1.906, Multiword + 16777216, 2.292, 1.912,, 1.912, Multiword + 33554432, 2.314, 1.914,, 1.914, Multiword + 67108864, 2.322, 1.918,, 1.918, Multiword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 8, 8, 8, 4, 0, 33408, 1179666 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.229, 6.190, 7.109, 7.001, 8.965, 10.620, 8.413, 8.962,, 6.190, Byte + 8, 2.630, 6.133, 6.616, 5.384, 4.063, 4.760, 4.022, 4.041,, 4.022, Multiword + 16, 1.377, 6.751, 7.095, 5.761, 3.010, 3.444, 2.938, 3.025,, 2.938, Multiword + 32, 0.828, 7.028, 7.395, 5.804, 2.563, 2.798, 2.680, 2.346,, 2.346, CRC32C + 64, 0.516, 7.222, 7.485, 5.975, 2.287, 2.498, 2.329, 2.133,, 2.133, CRC32C + 128, 0.370, 7.539, 7.567, 6.094, 2.177, 2.332, 2.172, 2.144,, 2.144, CRC32C + 256, 0.297, 7.461, 7.604, 6.127, 2.097, 2.280, 2.087, 2.062,, 2.062, CRC32C + 512, 0.259, 7.436, 7.678, 6.127, 2.081, 2.222, 2.053, 2.397,, 2.053, Multiword + 1024, 0.240, 7.373, 7.661, 6.143, 2.071, 2.234, 2.034, 2.201,, 2.034, Multiword + 2048, 0.230, 7.398, 7.639, 6.156, 2.059, 2.216, 2.024, 2.174,, 2.024, Multiword + 4096, 0.231, 7.431, 7.633, 6.154, 2.063, 2.205, 2.030, 2.224,, 2.030, Multiword + 8192, 0.225, 7.383, 7.629, 6.177, 2.053, 2.202, 2.025, 2.236,, 2.025, Multiword + 16384, 0.224, 7.336, 7.628, 6.171, 2.059, 2.182, 2.033, 2.244,, 2.033, Multiword + 32768, 0.229, 7.335, 7.627, 6.165, 2.063, 2.185, 2.045, 2.249,, 2.045, Multiword + 65536, 0.258, 7.335, 7.626, 6.161, 2.065, 2.261, 2.047, 2.254,, 2.047, Multiword + 131072, 0.258, 7.335, 7.626, 6.163, 2.063, 2.251, 2.046, 2.256,, 2.046, Multiword + 262144, 0.258, 7.373, 7.644, 6.165, 2.066, 2.245, 2.047, 2.259,, 2.047, Multiword + 524288, 0.258, 7.402, 7.693, 6.215, 2.066, 2.242, 2.047, 2.260,, 2.047, Multiword + 1048576, 0.258, 7.421, 7.707, 6.239, 2.090, 2.268, 2.070, 2.276,, 2.070, Multiword + 2097152, 0.260, 7.440, 7.721, 6.249, 2.088, 2.269, 2.071, 2.287,, 2.071, Multiword + 4194304, 0.260, 7.473, 7.767, 6.265, 2.103, 2.278, 2.074, 2.295,, 2.074, Multiword + 8388608, 0.540, 7.686, 7.981, 6.484, 2.224, 2.408, 2.203, 2.441,, 2.203, Multiword + 16777216, 0.556, 7.695, 7.996, 6.498, 2.241, 2.419, 2.219, 2.444,, 2.219, Multiword + 33554432, 0.559, 7.706, 8.001, 6.491, 2.248, 2.422, 2.222, 2.459,, 2.222, Multiword + 67108864, 0.560, 7.680, 8.006, 6.504, 2.246, 2.419, 2.224, 2.452,, 2.224, Multiword + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 8, 8, 8, 3, 0, 33408, 1198881 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 10.215, 8.553, 9.697,, 8.553, Multiword + 8, 4.695, 4.000, 4.049,, 4.000, Multiword + 16, 3.405, 3.069, 3.026,, 3.026, CRC32C + 32, 2.780, 2.596, 2.391,, 2.391, CRC32C + 64, 2.511, 2.191, 2.115,, 2.115, CRC32C + 128, 2.314, 1.920, 2.143,, 1.920, Multiword + 256, 2.248, 1.834, 2.062,, 1.834, Multiword + 512, 2.226, 1.771, 2.398,, 1.771, Multiword + 1024, 2.212, 1.742, 2.182,, 1.742, Multiword + 2048, 2.210, 1.744, 2.176,, 1.744, Multiword + 4096, 2.206, 1.740, 2.248,, 1.740, Multiword + 8192, 2.198, 1.741, 2.240,, 1.741, Multiword + 16384, 2.166, 1.746, 2.248,, 1.746, Multiword + 32768, 2.193, 1.751, 2.253,, 1.751, Multiword + 65536, 2.172, 1.752, 2.257,, 1.752, Multiword + 131072, 2.163, 1.751, 2.259,, 1.751, Multiword + 262144, 2.146, 1.751, 2.257,, 1.751, Multiword + 524288, 2.137, 1.750, 2.259,, 1.750, Multiword + 1048576, 2.157, 1.752, 2.282,, 1.752, Multiword + 2097152, 2.156, 1.776, 2.285,, 1.776, Multiword + 4194304, 2.162, 1.777, 2.299,, 1.777, Multiword + 8388608, 2.289, 1.894, 2.443,, 1.894, Multiword + 16777216, 2.296, 1.905, 2.450,, 1.905, Multiword + 33554432, 2.303, 1.912, 2.451,, 1.912, Multiword + 67108864, 2.305, 1.918, 2.456,, 1.918, Multiword + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 4, 4, 4, 4, 0, 8544, 1181124 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 3.251, 6.189, 7.038, 6.147, 5.251, 7.910, 6.512, 9.450,, 5.251, Word + 8, 1.875, 6.137, 6.613, 5.604, 3.752, 4.906, 4.173, 4.211,, 3.752, Word + 16, 1.000, 6.751, 7.043, 5.518, 3.108, 3.782, 3.513, 3.053,, 3.053, CRC32C + 32, 0.594, 7.070, 7.388, 5.817, 2.956, 3.415, 2.516, 2.417,, 2.417, CRC32C + 64, 0.412, 7.220, 7.487, 6.085, 2.860, 3.200, 2.032, 2.144,, 2.032, Multiword + 128, 0.323, 7.539, 7.543, 6.138, 2.851, 3.112, 1.735, 2.140,, 1.735, Multiword + 256, 0.287, 7.461, 7.584, 6.173, 2.825, 3.013, 1.678, 2.046,, 1.678, Multiword + 512, 0.268, 7.436, 7.662, 6.177, 2.804, 3.093, 1.617, 2.380,, 1.617, Multiword + 1024, 0.260, 7.373, 7.649, 6.181, 2.826, 3.047, 1.595, 2.208,, 1.595, Multiword + 2048, 0.263, 7.398, 7.636, 6.202, 2.838, 3.010, 1.591, 2.182,, 1.591, Multiword + 4096, 0.257, 7.431, 7.631, 6.208, 2.853, 2.999, 1.579, 2.235,, 1.579, Multiword + 8192, 0.253, 7.384, 7.627, 6.187, 2.842, 2.994, 1.571, 2.232,, 1.571, Multiword + 16384, 0.252, 7.336, 7.629, 6.213, 2.821, 2.990, 1.567, 2.241,, 1.567, Multiword + 32768, 0.259, 7.343, 7.626, 6.198, 2.806, 2.992, 1.579, 2.257,, 1.579, Multiword + 65536, 0.308, 7.336, 7.616, 6.194, 2.807, 2.000, 1.581, 2.261,, 1.581, Multiword + 131072, 0.308, 7.336, 7.609, 6.200, 2.802, 1.990, 1.580, 2.258,, 1.580, Multiword + 262144, 0.308, 7.378, 7.657, 6.202, 2.814, 1.988, 1.582, 2.259,, 1.582, Multiword + 524288, 0.309, 7.411, 7.699, 6.265, 2.833, 1.986, 1.580, 2.259,, 1.580, Multiword + 1048576, 0.309, 7.418, 7.706, 6.287, 2.825, 1.935, 1.583, 2.283,, 1.583, Multiword + 2097152, 0.312, 7.433, 7.722, 6.300, 2.875, 1.941, 1.596, 2.284,, 1.596, Multiword + 4194304, 0.312, 7.460, 7.757, 6.323, 2.880, 1.944, 1.602, 2.295,, 1.602, Multiword + 8388608, 0.546, 7.694, 7.967, 6.518, 3.021, 2.070, 1.715, 2.435,, 1.715, Multiword + 16777216, 0.558, 7.687, 7.989, 6.436, 3.030, 2.072, 1.691, 2.442,, 1.691, Multiword + 33554432, 0.556, 7.696, 8.004, 6.553, 3.049, 2.082, 1.726, 2.455,, 1.726, Multiword + 67108864, 0.562, 7.690, 7.997, 6.560, 3.048, 2.082, 1.726, 2.455,, 1.726, Multiword + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + GCC-4.5.0, 64, 32, 4, 4, 4, 3, 0, 8544, 1179927 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 7.577, 6.597, 9.416,, 6.597, Multiword + 8, 4.887, 4.201, 4.211,, 4.201, Multiword + 16, 3.647, 3.571, 3.044,, 3.044, CRC32C + 32, 3.248, 2.563, 2.417,, 2.417, CRC32C + 64, 3.032, 1.914, 2.151,, 1.914, Multiword + 128, 2.918, 1.709, 2.139,, 1.709, Multiword + 256, 2.877, 1.533, 2.066,, 1.533, Multiword + 512, 2.961, 1.482, 2.380,, 1.482, Multiword + 1024, 2.871, 1.456, 2.207,, 1.456, Multiword + 2048, 2.918, 1.433, 2.182,, 1.433, Multiword + 4096, 2.982, 1.419, 2.233,, 1.419, Multiword + 8192, 2.897, 1.417, 2.233,, 1.417, Multiword + 16384, 2.783, 1.410, 2.241,, 1.410, Multiword + 32768, 2.812, 1.425, 2.257,, 1.425, Multiword + 65536, 2.333, 1.426, 2.261,, 1.426, Multiword + 131072, 2.301, 1.426, 2.258,, 1.426, Multiword + 262144, 2.168, 1.427, 2.260,, 1.427, Multiword + 524288, 2.100, 1.428, 2.259,, 1.428, Multiword + 1048576, 2.116, 1.429, 2.283,, 1.429, Multiword + 2097152, 2.108, 1.442, 2.283,, 1.442, Multiword + 4194304, 2.114, 1.448, 2.293,, 1.448, Multiword + 8388608, 2.226, 1.550, 2.436,, 1.550, Multiword + 16777216, 2.237, 1.564, 2.449,, 1.564, Multiword + 33554432, 2.248, 1.567, 2.452,, 1.567, Multiword + 67108864, 2.248, 1.571, 2.454,, 1.571, Multiword + diff --git a/crcutil-1.0/doc/data/test-icl-32-1.csv b/crcutil-1.0/doc/data/test-icl-32-1.csv new file mode 100644 index 0000000..5fb2693 --- /dev/null +++ b/crcutil-1.0/doc/data/test-icl-32-1.csv @@ -0,0 +1,310 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 128, 16, 16, 8, 4, 0, 66736, 1475559 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 13.501, 20.001, 21.125, 20.256, 20.001, 21.501, 20.252,, 20.001, Byte + 8, 7.126, 15.905, 15.813, 15.626, 8.894, 10.001, 8.651,, 8.651, Multiword + 16, 4.227, 13.690, 13.505, 13.407, 6.555, 7.996, 6.500,, 6.500, Multiword + 32, 3.391, 12.422, 12.385, 11.860, 5.475, 6.879, 5.432,, 5.432, Multiword + 64, 1.953, 11.727, 11.766, 11.094, 4.923, 6.386, 5.455,, 4.923, Word + 128, 1.352, 11.399, 11.477, 10.743, 4.578, 6.166, 4.289,, 4.289, Multiword + 256, 1.055, 11.200, 11.333, 10.563, 4.413, 6.020, 3.711,, 3.711, Multiword + 512, 0.907, 11.100, 11.311, 10.469, 4.345, 5.945, 3.524,, 3.524, Multiword + 1024, 0.832, 11.050, 11.264, 10.422, 4.598, 6.091, 3.470,, 3.470, Multiword + 2048, 0.795, 11.025, 11.240, 10.399, 4.638, 6.179, 3.451,, 3.451, Multiword + 4096, 0.781, 11.026, 11.241, 10.387, 4.574, 6.111, 3.403,, 3.403, Multiword + 8192, 0.770, 11.020, 11.237, 10.385, 4.642, 6.166, 3.366,, 3.366, Multiword + 16384, 0.764, 11.017, 11.206, 10.381, 4.735, 6.207, 3.369,, 3.369, Multiword + 32768, 0.769, 11.016, 11.204, 10.379, 4.721, 6.229, 3.373,, 3.373, Multiword + 65536, 0.766, 11.015, 11.203, 10.378, 4.679, 5.611, 3.365,, 3.365, Multiword + 131072, 0.764, 11.018, 11.207, 10.377, 4.716, 5.312, 3.353,, 3.353, Multiword + 262144, 0.761, 11.079, 11.295, 10.450, 4.721, 5.166, 3.358,, 3.358, Multiword + 524288, 0.759, 11.160, 11.337, 10.469, 4.771, 5.100, 3.365,, 3.365, Multiword + 1048576, 0.760, 11.210, 11.370, 10.498, 4.788, 5.016, 3.409,, 3.409, Multiword + 2097152, 0.764, 11.298, 11.395, 10.515, 4.803, 4.995, 3.412,, 3.412, Multiword + 4194304, 0.765, 11.381, 11.450, 10.532, 4.831, 5.010, 3.424,, 3.424, Multiword + 8388608, 0.870, 11.613, 11.670, 10.785, 4.982, 5.124, 3.555,, 3.555, Multiword + 16777216, 0.864, 11.599, 11.676, 10.789, 4.983, 5.144, 3.562,, 3.562, Multiword + 33554432, 0.867, 11.635, 11.679, 10.794, 4.991, 5.138, 3.564,, 3.564, Multiword + 67108864, 0.876, 11.640, 11.680, 10.800, 4.997, 5.157, 3.571,, 3.571, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 128, 16, 16, 8, 3, 0, 66736, 1426932 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 21.564, 23.376,, 21.564, Blockword + 8, 10.450, 10.350,, 10.350, Multiword + 16, 8.190, 7.094,, 7.094, Multiword + 32, 6.992, 5.532,, 5.532, Multiword + 64, 6.428, 5.610,, 5.610, Multiword + 128, 6.138, 4.196,, 4.196, Multiword + 256, 6.016, 3.590,, 3.590, Multiword + 512, 5.955, 3.277,, 3.277, Multiword + 1024, 6.111, 3.252,, 3.252, Multiword + 2048, 6.116, 3.187,, 3.187, Multiword + 4096, 6.117, 3.120,, 3.120, Multiword + 8192, 6.145, 3.078,, 3.078, Multiword + 16384, 6.236, 3.087,, 3.087, Multiword + 32768, 6.221, 3.075,, 3.075, Multiword + 65536, 5.648, 3.060,, 3.060, Multiword + 131072, 5.312, 3.064,, 3.064, Multiword + 262144, 4.890, 3.063,, 3.063, Multiword + 524288, 4.694, 3.070,, 3.070, Multiword + 1048576, 4.668, 3.091,, 3.091, Multiword + 2097152, 4.627, 3.107,, 3.107, Multiword + 4194304, 4.628, 3.112,, 3.112, Multiword + 8388608, 4.692, 3.247,, 3.247, Multiword + 16777216, 4.752, 3.251,, 3.251, Multiword + 33554432, 4.766, 3.256,, 3.256, Multiword + 67108864, 4.760, 3.262,, 3.262, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 128, 16, 16, 4, 4, 0, 33968, 1351098 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 14.001, 20.439, 20.281, 20.251, 13.901, 14.489, 13.754,, 13.754, Multiword + 8, 7.407, 15.943, 15.885, 15.813, 9.665, 9.842, 9.292,, 9.292, Multiword + 16, 6.500, 13.439, 13.657, 13.407, 7.129, 7.397, 6.782,, 6.782, Multiword + 32, 3.688, 12.453, 12.542, 11.860, 5.913, 6.522, 6.905,, 5.913, Word + 64, 2.047, 11.758, 11.875, 11.094, 5.204, 5.938, 4.812,, 4.812, Multiword + 128, 1.414, 11.383, 11.602, 10.743, 4.888, 5.654, 3.898,, 3.898, Multiword + 256, 1.114, 11.192, 11.422, 10.563, 4.751, 5.525, 3.377,, 3.377, Multiword + 512, 0.964, 11.096, 11.309, 10.469, 4.681, 5.484, 3.090,, 3.090, Multiword + 1024, 0.934, 11.048, 11.263, 10.422, 4.641, 5.435, 2.964,, 2.964, Multiword + 2048, 0.860, 11.024, 11.239, 10.399, 4.697, 5.431, 2.922,, 2.922, Multiword + 4096, 0.838, 11.026, 11.240, 10.387, 4.590, 5.418, 2.892,, 2.892, Multiword + 8192, 0.829, 11.020, 11.234, 10.385, 4.581, 5.416, 2.881,, 2.881, Multiword + 16384, 0.823, 11.019, 11.231, 10.381, 4.578, 5.411, 2.880,, 2.880, Multiword + 32768, 0.877, 11.070, 11.279, 10.379, 4.576, 5.412, 2.879,, 2.879, Multiword + 65536, 0.876, 11.041, 11.257, 10.377, 4.575, 3.713, 2.876,, 2.876, Multiword + 131072, 0.823, 11.057, 11.235, 10.377, 4.574, 3.404, 2.874,, 2.874, Multiword + 262144, 0.860, 11.189, 11.321, 10.434, 4.575, 3.250, 2.880,, 2.880, Multiword + 524288, 0.850, 11.352, 11.338, 10.467, 4.629, 3.172, 2.875,, 2.875, Multiword + 1048576, 0.858, 11.466, 11.382, 10.491, 4.670, 3.009, 2.899,, 2.899, Multiword + 2097152, 0.835, 11.500, 11.396, 10.511, 4.713, 3.004, 2.915,, 2.915, Multiword + 4194304, 0.840, 11.567, 11.440, 10.561, 4.760, 3.001, 2.921,, 2.921, Multiword + 8388608, 0.923, 11.810, 11.682, 10.762, 4.906, 3.120, 3.060,, 3.060, Multiword + 16777216, 0.930, 11.815, 11.687, 10.755, 4.933, 3.127, 3.063,, 3.063, Multiword + 33554432, 0.936, 11.829, 11.659, 10.797, 4.949, 3.127, 3.063,, 3.063, Multiword + 67108864, 0.937, 11.826, 11.692, 10.794, 4.951, 3.126, 3.072,, 3.072, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 128, 16, 16, 4, 3, 0, 33968, 1333206 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 14.207, 16.002,, 14.207, Blockword + 8, 9.566, 10.378,, 9.566, Blockword + 16, 7.651, 7.439,, 7.439, Multiword + 32, 6.505, 7.656,, 6.505, Blockword + 64, 5.927, 4.938,, 4.938, Multiword + 128, 5.655, 3.875,, 3.875, Multiword + 256, 5.498, 3.258,, 3.258, Multiword + 512, 5.469, 2.963,, 2.963, Multiword + 1024, 5.432, 2.821,, 2.821, Multiword + 2048, 5.443, 2.754,, 2.754, Multiword + 4096, 5.425, 2.710,, 2.710, Multiword + 8192, 5.414, 2.694,, 2.694, Multiword + 16384, 5.415, 2.697,, 2.697, Multiword + 32768, 5.412, 2.704,, 2.704, Multiword + 65536, 4.269, 2.703,, 2.703, Multiword + 131072, 3.958, 2.703,, 2.703, Multiword + 262144, 3.361, 2.702,, 2.702, Multiword + 524288, 3.063, 2.702,, 2.702, Multiword + 1048576, 3.044, 2.727,, 2.727, Multiword + 2097152, 2.981, 2.731,, 2.731, Multiword + 4194304, 2.981, 2.742,, 2.742, Multiword + 8388608, 3.086, 2.872,, 2.872, Multiword + 16777216, 3.086, 2.887,, 2.887, Multiword + 33554432, 3.086, 2.885,, 2.885, Multiword + 67108864, 3.086, 2.816,, 2.816, Multiword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 64, 8, 8, 8, 4, 0, 33368, 124902 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 9.737, 11.498, 11.841, 15.248, 15.121, 14.716, 11.178,, 11.178, Multiword + 8, 4.773, 9.290, 9.418, 10.346, 8.089, 8.251, 9.177,, 8.089, Word + 16, 2.658, 7.938, 8.092, 8.609, 5.974, 6.171, 5.625,, 5.625, Multiword + 32, 1.305, 7.687, 7.813, 7.740, 4.819, 5.059, 3.813,, 3.813, Multiword + 64, 0.771, 7.223, 7.436, 7.342, 4.426, 4.736, 2.573,, 2.573, Multiword + 128, 0.519, 6.862, 7.397, 7.186, 4.134, 4.485, 1.868,, 1.868, Multiword + 256, 0.396, 6.730, 7.242, 7.013, 4.033, 4.334, 1.540,, 1.540, Multiword + 512, 0.324, 6.671, 7.405, 7.002, 3.939, 4.328, 1.427,, 1.427, Multiword + 1024, 0.293, 6.627, 7.365, 6.933, 3.918, 4.291, 1.338,, 1.338, Multiword + 2048, 0.279, 6.552, 7.341, 6.894, 3.915, 4.261, 1.293,, 1.293, Multiword + 4096, 0.276, 6.543, 7.329, 6.917, 3.903, 4.251, 1.275,, 1.275, Multiword + 8192, 0.270, 6.541, 7.329, 6.914, 3.894, 4.250, 1.272,, 1.272, Multiword + 16384, 0.267, 6.539, 6.739, 6.910, 3.895, 4.252, 1.281,, 1.281, Multiword + 32768, 0.274, 6.652, 7.209, 6.909, 3.894, 4.259, 1.288,, 1.288, Multiword + 65536, 0.303, 6.485, 7.237, 6.908, 3.893, 5.376, 1.289,, 1.289, Multiword + 131072, 0.303, 6.428, 7.176, 6.896, 3.894, 5.338, 1.288,, 1.288, Multiword + 262144, 0.303, 6.538, 7.152, 6.944, 3.899, 5.321, 1.287,, 1.287, Multiword + 524288, 0.302, 6.825, 7.214, 6.959, 3.927, 5.348, 1.287,, 1.287, Multiword + 1048576, 0.303, 7.164, 7.324, 6.974, 3.932, 5.435, 1.288,, 1.288, Multiword + 2097152, 0.305, 7.411, 7.376, 7.030, 3.952, 5.440, 1.301,, 1.301, Multiword + 4194304, 0.305, 7.507, 7.486, 7.085, 3.964, 5.440, 1.304,, 1.304, Multiword + 8388608, 0.547, 7.563, 7.691, 7.270, 4.116, 5.607, 1.408,, 1.408, Multiword + 16777216, 0.551, 7.625, 7.658, 7.278, 4.130, 5.615, 1.412,, 1.412, Multiword + 33554432, 0.549, 7.732, 7.718, 7.287, 4.129, 5.624, 1.415,, 1.415, Multiword + 67108864, 0.553, 7.748, 7.725, 7.285, 4.139, 5.628, 1.419,, 1.419, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 64, 8, 8, 8, 3, 0, 33368, 134622 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 14.512, 14.751,, 14.512, Blockword + 8, 8.174, 7.805,, 7.805, Multiword + 16, 6.313, 5.938,, 5.938, Multiword + 32, 5.261, 5.135,, 5.135, Multiword + 64, 4.588, 5.781,, 4.588, Blockword + 128, 4.493, 5.602,, 4.493, Blockword + 256, 4.378, 5.410,, 4.378, Blockword + 512, 4.332, 5.393,, 4.332, Blockword + 1024, 4.291, 5.316,, 4.291, Blockword + 2048, 4.255, 5.310,, 4.255, Blockword + 4096, 4.226, 5.301,, 4.226, Blockword + 8192, 4.243, 5.300,, 4.243, Blockword + 16384, 4.248, 5.312,, 4.248, Blockword + 32768, 4.250, 5.308,, 4.250, Blockword + 65536, 5.039, 5.322,, 5.039, Blockword + 131072, 5.001, 5.324,, 5.001, Blockword + 262144, 5.161, 5.324,, 5.161, Blockword + 524288, 5.286, 5.365,, 5.286, Blockword + 1048576, 5.290, 5.382,, 5.290, Blockword + 2097152, 5.326, 5.387,, 5.326, Blockword + 4194304, 5.334, 5.412,, 5.334, Blockword + 8388608, 5.500, 5.590,, 5.500, Blockword + 16777216, 5.517, 5.601,, 5.517, Blockword + 33554432, 5.524, 5.606,, 5.524, Blockword + 67108864, 5.529, 5.604,, 5.529, Blockword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 32, 8, 8, 8, 4, 0, 33368, 1051641 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 9.317, 11.407, 11.414, 15.212, 14.841, 14.753, 11.312, 8.790,, 8.790, CRC32C + 8, 4.770, 9.321, 9.428, 10.464, 8.112, 8.251, 9.389, 5.946,, 5.946, CRC32C + 16, 2.659, 7.942, 8.209, 8.439, 5.970, 6.283, 5.563, 3.698,, 3.698, CRC32C + 32, 1.313, 7.445, 7.811, 7.728, 4.835, 5.225, 3.813, 3.319,, 3.319, CRC32C + 64, 0.777, 7.255, 7.437, 7.307, 4.415, 4.720, 2.563, 3.298,, 2.563, Multiword + 128, 0.517, 6.902, 7.371, 7.169, 4.130, 4.509, 1.891, 3.210,, 1.891, Multiword + 256, 0.373, 6.849, 7.221, 7.013, 4.018, 4.351, 1.584, 3.060,, 1.584, Multiword + 512, 0.324, 6.682, 7.403, 7.003, 3.947, 4.328, 1.416, 2.012,, 1.416, Multiword + 1024, 0.294, 6.587, 7.367, 6.930, 3.924, 4.280, 1.330, 1.962,, 1.330, Multiword + 2048, 0.280, 6.559, 7.342, 6.894, 3.912, 4.261, 1.292, 1.936,, 1.292, Multiword + 4096, 0.276, 6.532, 7.347, 6.921, 3.905, 4.248, 1.281, 1.927,, 1.281, Multiword + 8192, 0.270, 6.573, 7.286, 6.908, 3.893, 4.256, 1.269, 1.923,, 1.269, Multiword + 16384, 0.268, 6.557, 6.739, 6.909, 3.895, 4.253, 1.281, 1.927,, 1.281, Multiword + 32768, 0.274, 6.505, 7.311, 6.910, 3.897, 4.258, 1.288, 1.936,, 1.288, Multiword + 65536, 0.303, 6.485, 7.262, 6.898, 3.900, 5.303, 1.288, 1.934,, 1.288, Multiword + 131072, 0.303, 6.392, 7.202, 6.902, 3.899, 5.294, 1.287, 1.934,, 1.287, Multiword + 262144, 0.303, 6.626, 7.086, 6.935, 3.899, 5.284, 1.287, 1.934,, 1.287, Multiword + 524288, 0.302, 6.754, 7.222, 6.985, 3.928, 5.326, 1.287, 1.936,, 1.287, Multiword + 1048576, 0.303, 7.167, 7.274, 7.002, 3.935, 5.403, 1.288, 1.944,, 1.288, Multiword + 2097152, 0.305, 7.239, 7.400, 7.031, 3.954, 5.410, 1.301, 1.960,, 1.301, Multiword + 4194304, 0.305, 7.451, 7.490, 7.068, 3.962, 5.417, 1.301, 1.963,, 1.301, Multiword + 8388608, 0.541, 7.630, 7.695, 7.281, 4.123, 5.575, 1.409, 2.081,, 1.409, Multiword + 16777216, 0.552, 7.628, 7.674, 7.288, 4.132, 5.585, 1.414, 2.092,, 1.414, Multiword + 33554432, 0.553, 7.651, 7.723, 7.280, 4.137, 5.598, 1.417, 2.096,, 1.417, Multiword + 67108864, 0.553, 7.719, 7.725, 7.303, 4.115, 5.596, 1.419, 2.098,, 1.419, Multiword + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 32, 8, 8, 8, 3, 0, 33368, 1049103 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 14.206, 13.817, 8.828,, 8.828, CRC32C + 8, 8.207, 7.659, 6.026,, 6.026, CRC32C + 16, 6.243, 5.943, 4.032,, 4.032, CRC32C + 32, 5.252, 5.167, 3.485,, 3.485, CRC32C + 64, 4.611, 5.719, 3.448,, 3.448, CRC32C + 128, 4.456, 5.578, 3.166,, 3.166, CRC32C + 256, 4.379, 5.399, 3.060,, 3.060, CRC32C + 512, 4.289, 5.369, 2.020,, 2.020, CRC32C + 1024, 4.289, 5.297, 1.959,, 1.959, CRC32C + 2048, 4.282, 5.279, 1.935,, 1.935, CRC32C + 4096, 4.262, 5.305, 1.922,, 1.922, CRC32C + 8192, 4.241, 5.293, 1.924,, 1.924, CRC32C + 16384, 4.249, 5.304, 1.925,, 1.925, CRC32C + 32768, 4.258, 5.320, 1.935,, 1.935, CRC32C + 65536, 4.977, 5.320, 1.935,, 1.935, CRC32C + 131072, 4.963, 5.322, 1.934,, 1.934, CRC32C + 262144, 5.131, 5.323, 1.936,, 1.936, CRC32C + 524288, 5.239, 5.369, 1.936,, 1.936, CRC32C + 1048576, 5.272, 5.382, 1.950,, 1.950, CRC32C + 2097152, 5.296, 5.389, 1.956,, 1.956, CRC32C + 4194304, 5.309, 5.410, 1.963,, 1.963, CRC32C + 8388608, 5.482, 5.591, 2.086,, 2.086, CRC32C + 16777216, 5.493, 5.598, 2.091,, 2.091, CRC32C + 33554432, 5.501, 5.601, 2.098,, 2.098, CRC32C + 67108864, 5.496, 5.608, 2.100,, 2.100, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 32, 4, 4, 4, 4, 0, 8500, 1011924 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 8.781, 8.707, 7.040, 9.954, 8.894, 8.733, 8.001, 8.127,, 7.040, ByteUnrolled + 8, 4.501, 6.794, 6.636, 7.759, 5.501, 5.752, 5.203, 5.729,, 5.203, Multiword + 16, 1.992, 7.121, 6.876, 6.846, 4.315, 4.365, 4.106, 3.689,, 3.689, CRC32C + 32, 1.132, 7.232, 7.216, 6.589, 3.609, 3.686, 4.266, 3.261,, 3.261, CRC32C + 64, 0.737, 7.393, 7.274, 6.349, 3.275, 3.384, 3.750, 3.407,, 3.275, Word + 128, 0.516, 7.389, 7.344, 6.340, 3.111, 3.260, 3.551, 3.149,, 3.111, Word + 256, 0.416, 7.623, 7.385, 6.332, 3.010, 3.158, 3.311, 3.113,, 3.010, Word + 512, 0.364, 7.534, 7.398, 6.299, 2.963, 3.091, 3.297, 2.015,, 2.015, CRC32C + 1024, 0.341, 7.494, 7.354, 6.315, 2.948, 3.152, 3.251, 1.951,, 1.951, CRC32C + 2048, 0.323, 7.475, 7.343, 6.342, 2.976, 3.027, 3.222, 1.942,, 1.942, CRC32C + 4096, 0.312, 7.466, 7.335, 6.339, 2.965, 3.096, 3.208, 1.928,, 1.928, CRC32C + 8192, 0.303, 7.460, 7.331, 6.335, 2.963, 3.012, 3.201, 1.925,, 1.925, CRC32C + 16384, 0.300, 7.467, 7.332, 6.333, 2.960, 3.016, 3.203, 1.930,, 1.930, CRC32C + 32768, 0.304, 7.529, 7.431, 6.331, 2.959, 3.020, 3.234, 1.933,, 1.933, CRC32C + 65536, 0.319, 7.494, 7.401, 6.327, 2.954, 3.097, 3.237, 1.934,, 1.934, CRC32C + 131072, 0.318, 7.484, 7.356, 6.320, 2.944, 3.073, 3.237, 1.932,, 1.932, CRC32C + 262144, 0.319, 7.498, 7.442, 6.329, 2.943, 3.080, 3.238, 1.935,, 1.935, CRC32C + 524288, 0.319, 7.586, 7.466, 6.368, 2.942, 3.086, 3.251, 1.936,, 1.936, CRC32C + 1048576, 0.319, 7.596, 7.472, 6.386, 2.978, 3.110, 3.267, 1.949,, 1.949, CRC32C + 2097152, 0.321, 7.590, 7.485, 6.403, 2.985, 3.122, 3.284, 1.957,, 1.957, CRC32C + 4194304, 0.321, 7.647, 7.521, 6.419, 3.013, 3.130, 3.296, 1.966,, 1.966, CRC32C + 8388608, 0.546, 7.857, 7.726, 6.605, 3.138, 3.264, 3.440, 2.087,, 2.087, CRC32C + 16777216, 0.556, 7.867, 7.736, 6.614, 3.151, 3.271, 3.447, 2.093,, 2.093, CRC32C + 33554432, 0.559, 7.872, 7.737, 6.614, 3.152, 3.278, 3.451, 2.082,, 2.082, CRC32C + 67108864, 0.560, 7.878, 7.715, 6.626, 3.158, 3.276, 3.454, 2.098,, 2.098, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 32, 32, 4, 4, 4, 3, 0, 8500, 1008315 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 10.252, 8.126, 8.142,, 8.126, Multiword + 8, 7.196, 5.376, 5.710,, 5.376, Multiword + 16, 4.746, 4.063, 3.782,, 3.782, CRC32C + 32, 3.784, 4.750, 3.261,, 3.261, CRC32C + 64, 3.521, 3.938, 3.362,, 3.362, CRC32C + 128, 3.313, 3.448, 3.149,, 3.149, CRC32C + 256, 3.173, 3.223, 3.110,, 3.110, CRC32C + 512, 3.190, 3.112, 2.010,, 2.010, CRC32C + 1024, 3.156, 3.068, 1.951,, 1.951, CRC32C + 2048, 3.071, 3.038, 1.946,, 1.946, CRC32C + 4096, 3.088, 3.030, 1.927,, 1.927, CRC32C + 8192, 3.076, 3.023, 1.924,, 1.924, CRC32C + 16384, 3.013, 3.018, 1.926,, 1.926, CRC32C + 32768, 3.003, 3.034, 1.934,, 1.934, CRC32C + 65536, 2.905, 3.023, 1.933,, 1.933, CRC32C + 131072, 2.890, 2.999, 1.934,, 1.934, CRC32C + 262144, 2.835, 3.003, 1.934,, 1.934, CRC32C + 524288, 2.808, 3.002, 1.936,, 1.936, CRC32C + 1048576, 2.828, 3.040, 1.945,, 1.945, CRC32C + 2097152, 2.831, 3.060, 1.957,, 1.957, CRC32C + 4194304, 2.841, 3.067, 1.960,, 1.960, CRC32C + 8388608, 2.970, 3.207, 2.086,, 2.086, CRC32C + 16777216, 2.982, 3.190, 2.088,, 2.088, CRC32C + 33554432, 2.984, 3.215, 2.099,, 2.099, CRC32C + 67108864, 2.986, 3.224, 2.098,, 2.098, CRC32C + diff --git a/crcutil-1.0/doc/data/test-icl-64-1.csv b/crcutil-1.0/doc/data/test-icl-64-1.csv new file mode 100644 index 0000000..a1442ae --- /dev/null +++ b/crcutil-1.0/doc/data/test-icl-64-1.csv @@ -0,0 +1,310 @@ +ClassTitle, CRC-128-sse2/sse2/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 128, 16, 16, 8, 4, 0, 66736, 1101915 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 5.501, 10.343, 10.361, 11.685, 11.734, 13.631, 12.491,, 10.343, Byte + 8, 2.546, 10.376, 10.265, 10.678, 4.629, 6.750, 5.171,, 4.629, Word + 16, 1.613, 10.754, 10.566, 9.938, 3.852, 5.121, 4.183,, 3.852, Word + 32, 1.173, 10.938, 10.993, 10.313, 3.633, 4.656, 3.474,, 3.474, Multiword + 64, 1.097, 11.016, 11.094, 10.516, 3.396, 4.332, 3.089,, 3.089, Multiword + 128, 1.040, 11.227, 11.141, 10.375, 3.289, 4.228, 2.521,, 2.521, Multiword + 256, 1.016, 11.114, 11.164, 10.411, 3.240, 4.156, 2.205,, 2.205, Multiword + 512, 0.998, 11.058, 11.253, 10.401, 3.199, 4.117, 2.152,, 2.152, Multiword + 1024, 0.991, 11.030, 11.221, 10.401, 3.380, 4.330, 2.167,, 2.167, Multiword + 2048, 0.989, 11.015, 11.206, 10.396, 3.609, 4.458, 2.125,, 2.125, Multiword + 4096, 0.992, 11.024, 11.213, 10.394, 3.559, 4.362, 2.073,, 2.073, Multiword + 8192, 0.988, 11.026, 11.206, 10.396, 3.597, 4.437, 2.052,, 2.052, Multiword + 16384, 0.986, 11.017, 11.204, 10.394, 3.674, 4.480, 2.060,, 2.060, Multiword + 32768, 0.986, 11.016, 11.204, 10.393, 3.711, 4.503, 2.048,, 2.048, Multiword + 65536, 0.985, 11.016, 11.205, 10.392, 3.664, 2.980, 2.048,, 2.048, Multiword + 131072, 0.985, 11.109, 11.241, 10.392, 3.725, 2.775, 2.049,, 2.049, Multiword + 262144, 0.985, 11.178, 11.363, 10.527, 3.736, 2.664, 2.053,, 2.053, Multiword + 524288, 0.984, 11.231, 11.417, 10.554, 3.799, 2.610, 2.055,, 2.055, Multiword + 1048576, 0.984, 11.242, 11.431, 10.590, 3.783, 2.488, 2.085,, 2.085, Multiword + 2097152, 0.996, 11.255, 11.458, 10.616, 3.833, 2.489, 2.099,, 2.099, Multiword + 4194304, 1.003, 11.281, 11.473, 10.628, 3.844, 2.481, 2.101,, 2.101, Multiword + 8388608, 1.090, 11.492, 11.692, 10.847, 3.953, 2.588, 2.201,, 2.201, Multiword + 16777216, 1.090, 11.511, 11.718, 10.875, 3.965, 2.600, 2.210,, 2.210, Multiword + 33554432, 1.093, 11.518, 11.717, 10.880, 3.969, 2.595, 2.200,, 2.200, Multiword + 67108864, 1.096, 11.525, 11.727, 10.882, 3.983, 2.588, 2.215,, 2.215, Multiword + +ClassTitle, CRC-128-sse2/sse2/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 128, 16, 16, 8, 3, 0, 66736, 1064394 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 13.945, 12.789,, 12.789, Multiword + 8, 6.684, 5.157,, 5.157, Multiword + 16, 5.225, 4.195,, 4.195, Multiword + 32, 4.317, 3.663,, 3.663, Multiword + 64, 4.368, 3.194,, 3.194, Multiword + 128, 4.239, 2.533,, 2.533, Multiword + 256, 4.157, 2.310,, 2.310, Multiword + 512, 4.131, 2.194,, 2.194, Multiword + 1024, 4.310, 2.280,, 2.280, Multiword + 2048, 4.448, 2.273,, 2.273, Multiword + 4096, 4.395, 2.224,, 2.224, Multiword + 8192, 4.436, 2.186,, 2.186, Multiword + 16384, 4.466, 2.196,, 2.196, Multiword + 32768, 4.502, 2.192,, 2.192, Multiword + 65536, 3.565, 2.182,, 2.182, Multiword + 131072, 3.358, 2.181,, 2.181, Multiword + 262144, 2.919, 2.187,, 2.187, Multiword + 524288, 2.688, 2.189,, 2.189, Multiword + 1048576, 2.693, 2.224,, 2.224, Multiword + 2097152, 2.651, 2.224,, 2.224, Multiword + 4194304, 2.653, 2.239,, 2.239, Multiword + 8388608, 2.751, 2.351,, 2.351, Multiword + 16777216, 2.757, 2.358,, 2.358, Multiword + 33554432, 2.751, 2.351,, 2.351, Multiword + 67108864, 2.756, 2.362,, 2.362, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 128, 16, 16, 4, 4, 0, 33968, 999252 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.589, 10.343, 10.361, 11.697, 7.809, 10.250, 8.532,, 7.809, Word + 8, 3.751, 10.365, 10.313, 10.678, 5.839, 7.192, 6.306,, 5.839, Word + 16, 1.716, 10.732, 10.564, 9.938, 5.252, 6.126, 5.434,, 5.252, Word + 32, 1.313, 10.938, 10.993, 10.315, 4.737, 5.630, 4.157,, 4.157, Multiword + 64, 1.196, 11.016, 11.094, 10.516, 4.642, 5.342, 3.119,, 3.119, Multiword + 128, 1.133, 11.227, 11.141, 10.375, 4.547, 5.248, 2.643,, 2.643, Multiword + 256, 1.114, 11.114, 11.164, 10.411, 4.644, 5.199, 2.360,, 2.360, Multiword + 512, 1.104, 11.057, 11.253, 10.401, 4.737, 5.256, 2.244,, 2.244, Multiword + 1024, 1.098, 11.030, 11.221, 10.401, 4.658, 5.206, 2.180,, 2.180, Multiword + 2048, 1.105, 11.017, 11.206, 10.396, 4.631, 5.196, 2.150,, 2.150, Multiword + 4096, 1.100, 11.027, 11.212, 10.394, 4.604, 5.192, 2.135,, 2.135, Multiword + 8192, 1.097, 11.023, 11.206, 10.396, 4.593, 5.186, 2.130,, 2.130, Multiword + 16384, 1.095, 11.017, 11.204, 10.394, 4.588, 5.195, 2.135,, 2.135, Multiword + 32768, 1.095, 11.016, 11.203, 10.393, 4.579, 5.199, 2.137,, 2.137, Multiword + 65536, 1.094, 11.016, 11.203, 10.392, 4.577, 3.231, 2.139,, 2.139, Multiword + 131072, 1.094, 11.112, 11.260, 10.392, 4.579, 3.025, 2.134,, 2.134, Multiword + 262144, 1.093, 11.202, 11.370, 10.501, 4.580, 2.916, 2.138,, 2.138, Multiword + 524288, 1.093, 11.226, 11.418, 10.565, 4.687, 2.884, 2.139,, 2.139, Multiword + 1048576, 1.093, 11.256, 11.431, 10.584, 4.704, 2.712, 2.169,, 2.169, Multiword + 2097152, 1.107, 11.253, 11.458, 10.603, 4.724, 2.717, 2.180,, 2.180, Multiword + 4194304, 1.112, 11.262, 11.475, 10.638, 4.733, 2.713, 2.184,, 2.184, Multiword + 8388608, 1.201, 11.480, 11.691, 10.847, 4.886, 2.818, 2.295,, 2.295, Multiword + 16777216, 1.203, 11.507, 11.714, 10.864, 4.900, 2.831, 2.295,, 2.295, Multiword + 33554432, 1.208, 11.518, 11.711, 10.872, 4.911, 2.830, 2.301,, 2.301, Multiword + 67108864, 1.206, 11.508, 11.730, 10.865, 4.918, 2.829, 2.308,, 2.308, Multiword + +ClassTitle, CRC-128-sse2/sse2/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 128, 16, 16, 4, 3, 0, 33968, 983592 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 10.126, 8.425,, 8.425, Multiword + 8, 7.204, 6.224,, 6.224, Multiword + 16, 6.082, 5.429,, 5.429, Multiword + 32, 5.567, 4.351,, 4.351, Multiword + 64, 5.370, 3.175,, 3.175, Multiword + 128, 5.254, 2.844,, 2.844, Multiword + 256, 5.207, 2.520,, 2.520, Multiword + 512, 5.242, 2.416,, 2.416, Multiword + 1024, 5.192, 2.368,, 2.368, Multiword + 2048, 5.203, 2.331,, 2.331, Multiword + 4096, 5.203, 2.313,, 2.313, Multiword + 8192, 5.198, 2.312,, 2.312, Multiword + 16384, 5.195, 2.313,, 2.313, Multiword + 32768, 5.199, 2.319,, 2.319, Multiword + 65536, 3.917, 2.319,, 2.319, Multiword + 131072, 3.703, 2.319,, 2.319, Multiword + 262144, 3.178, 2.319,, 2.319, Multiword + 524288, 2.915, 2.321,, 2.321, Multiword + 1048576, 2.921, 2.355,, 2.355, Multiword + 2097152, 2.864, 2.363,, 2.363, Multiword + 4194304, 2.862, 2.372,, 2.372, Multiword + 8388608, 2.959, 2.482,, 2.482, Multiword + 16777216, 2.968, 2.490,, 2.490, Multiword + 33554432, 2.903, 2.500,, 2.500, Multiword + 67108864, 2.949, 2.496,, 2.496, Multiword + +ClassTitle, CRC-64-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 64, 8, 8, 8, 4, 0, 33384, 79965 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword,, BestTime, BestMethod + 4, 6.502, 6.521, 6.124, 8.293, 8.280, 9.355, 8.799,, 6.124, ByteUnrolled + 8, 2.876, 6.187, 6.135, 5.969, 3.788, 4.341, 4.115,, 3.788, Word + 16, 1.501, 6.755, 6.801, 6.418, 3.015, 3.283, 3.188,, 3.015, Word + 32, 0.856, 7.126, 7.130, 6.376, 2.535, 2.799, 2.791,, 2.535, Word + 64, 0.528, 7.312, 7.251, 6.216, 2.313, 2.513, 2.225,, 2.225, Multiword + 128, 0.377, 7.407, 7.364, 6.154, 2.196, 2.399, 1.836,, 1.836, Multiword + 256, 0.321, 7.578, 7.402, 6.180, 2.171, 2.328, 1.649,, 1.649, Multiword + 512, 0.290, 7.530, 7.533, 6.172, 2.130, 2.287, 1.536,, 1.536, Multiword + 1024, 0.278, 7.525, 7.515, 6.199, 2.130, 2.316, 1.494,, 1.494, Multiword + 2048, 0.270, 7.536, 7.508, 6.195, 2.124, 2.290, 1.465,, 1.465, Multiword + 4096, 0.274, 7.535, 7.518, 6.206, 2.124, 2.281, 1.454,, 1.454, Multiword + 8192, 0.271, 7.407, 7.521, 6.202, 2.118, 2.276, 1.458,, 1.458, Multiword + 16384, 0.271, 7.492, 7.515, 6.200, 2.118, 2.278, 1.453,, 1.453, Multiword + 32768, 0.274, 7.436, 7.409, 6.199, 2.114, 2.280, 1.456,, 1.456, Multiword + 65536, 0.303, 7.341, 7.431, 6.201, 2.108, 1.640, 1.454,, 1.454, Multiword + 131072, 0.303, 7.345, 7.408, 6.201, 2.115, 1.617, 1.453,, 1.453, Multiword + 262144, 0.302, 7.605, 7.546, 6.228, 2.123, 1.605, 1.455,, 1.455, Multiword + 524288, 0.302, 7.639, 7.570, 6.283, 2.124, 1.599, 1.455,, 1.455, Multiword + 1048576, 0.302, 7.670, 7.607, 6.312, 2.155, 1.566, 1.467,, 1.467, Multiword + 2097152, 0.305, 7.676, 7.609, 6.331, 2.163, 1.578, 1.480,, 1.480, Multiword + 4194304, 0.305, 7.689, 7.618, 6.335, 2.169, 1.584, 1.485,, 1.485, Multiword + 8388608, 0.549, 7.900, 7.808, 6.514, 2.285, 1.687, 1.584,, 1.584, Multiword + 16777216, 0.549, 7.840, 7.840, 6.524, 2.294, 1.697, 1.591,, 1.591, Multiword + 33554432, 0.554, 7.918, 7.838, 6.518, 2.305, 1.700, 1.591,, 1.591, Multiword + 67108864, 0.552, 7.905, 7.845, 6.539, 2.304, 1.703, 1.598,, 1.598, Multiword + +ClassTitle, CRC-64-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 64, 8, 8, 8, 3, 0, 33384, 85698 + +, Blockword, Multiword,, BestTime, BestMethod + 4, 9.267, 9.134,, 9.134, Multiword + 8, 4.326, 4.126,, 4.126, Multiword + 16, 3.251, 3.195,, 3.195, Multiword + 32, 2.811, 2.717,, 2.717, Multiword + 64, 2.540, 2.282,, 2.282, Multiword + 128, 2.385, 1.821,, 1.821, Multiword + 256, 2.354, 1.650,, 1.650, Multiword + 512, 2.323, 1.518,, 1.518, Multiword + 1024, 2.328, 1.475,, 1.475, Multiword + 2048, 2.303, 1.452,, 1.452, Multiword + 4096, 2.297, 1.438,, 1.438, Multiword + 8192, 2.292, 1.432,, 1.432, Multiword + 16384, 2.296, 1.441,, 1.441, Multiword + 32768, 2.298, 1.445,, 1.445, Multiword + 65536, 1.822, 1.446,, 1.446, Multiword + 131072, 1.796, 1.445,, 1.445, Multiword + 262144, 1.660, 1.445,, 1.445, Multiword + 524288, 1.589, 1.445,, 1.445, Multiword + 1048576, 1.598, 1.452,, 1.452, Multiword + 2097152, 1.594, 1.471,, 1.471, Multiword + 4194304, 1.601, 1.477,, 1.477, Multiword + 8388608, 1.697, 1.588,, 1.588, Multiword + 16777216, 1.703, 1.597,, 1.597, Multiword + 33554432, 1.703, 1.600,, 1.600, Multiword + 67108864, 1.707, 1.603,, 1.603, Multiword + +ClassTitle, CRC-32-u64/u64/u64-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 32, 8, 8, 8, 4, 0, 33384, 1118907 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.502, 6.520, 6.126, 8.290, 8.280, 9.413, 9.084, 8.001,, 6.126, ByteUnrolled + 8, 2.876, 6.191, 6.130, 6.304, 3.788, 4.550, 4.376, 3.751,, 3.751, CRC32C + 16, 1.502, 6.777, 6.815, 6.418, 3.004, 3.447, 3.188, 2.876,, 2.876, CRC32C + 32, 0.851, 7.138, 7.128, 6.376, 2.602, 2.860, 2.805, 2.314,, 2.314, CRC32C + 64, 0.516, 7.280, 7.250, 6.214, 2.313, 2.515, 2.224, 2.235,, 2.224, Multiword + 128, 0.381, 7.407, 7.363, 6.154, 2.223, 2.399, 1.811, 2.313,, 1.811, Multiword + 256, 0.321, 7.578, 7.403, 6.180, 2.156, 2.310, 1.630, 2.243,, 1.630, Multiword + 512, 0.291, 7.530, 7.533, 6.171, 2.131, 2.291, 1.545, 1.532,, 1.532, CRC32C + 1024, 0.274, 7.524, 7.515, 6.204, 2.133, 2.317, 1.492, 1.467,, 1.467, CRC32C + 2048, 0.270, 7.534, 7.508, 6.195, 2.124, 2.289, 1.471, 1.453,, 1.453, CRC32C + 4096, 0.276, 7.536, 7.514, 6.206, 2.125, 2.281, 1.458, 1.417,, 1.417, CRC32C + 8192, 0.271, 7.408, 7.517, 6.202, 2.118, 2.276, 1.448, 1.416,, 1.416, CRC32C + 16384, 0.270, 7.489, 7.516, 6.200, 2.119, 2.275, 1.453, 1.423,, 1.423, CRC32C + 32768, 0.273, 7.436, 7.409, 6.199, 2.114, 2.278, 1.453, 1.317,, 1.317, CRC32C + 65536, 0.303, 7.324, 7.413, 6.201, 2.110, 1.594, 1.454, 1.320,, 1.320, CRC32C + 131072, 0.302, 7.402, 7.441, 6.199, 2.115, 1.585, 1.455, 1.318,, 1.318, CRC32C + 262144, 0.302, 7.616, 7.576, 6.244, 2.112, 1.581, 1.455, 1.317,, 1.317, CRC32C + 524288, 0.302, 7.639, 7.580, 6.283, 2.124, 1.579, 1.455, 1.318,, 1.318, CRC32C + 1048576, 0.302, 7.658, 7.600, 6.310, 2.152, 1.544, 1.467, 1.321,, 1.321, CRC32C + 2097152, 0.305, 7.665, 7.609, 6.323, 2.156, 1.559, 1.478, 1.339,, 1.339, CRC32C + 4194304, 0.305, 7.684, 7.628, 6.334, 2.170, 1.566, 1.484, 1.347,, 1.347, CRC32C + 8388608, 0.544, 7.907, 7.740, 6.407, 2.292, 1.672, 1.585, 1.460,, 1.460, CRC32C + 16777216, 0.552, 7.911, 7.825, 6.527, 2.297, 1.678, 1.591, 1.467,, 1.467, CRC32C + 33554432, 0.555, 7.913, 7.838, 6.539, 2.303, 1.677, 1.594, 1.471,, 1.471, CRC32C + 67108864, 0.555, 7.920, 7.845, 6.514, 2.303, 1.684, 1.595, 1.470,, 1.470, CRC32C + +ClassTitle, CRC-32-u64/u64/u64-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 32, 8, 8, 8, 3, 0, 33384, 1117989 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 9.288, 9.134, 7.851,, 7.851, CRC32C + 8, 4.326, 4.126, 3.677,, 3.677, CRC32C + 16, 3.289, 3.195, 2.877,, 2.877, CRC32C + 32, 2.810, 2.727, 2.313,, 2.313, CRC32C + 64, 2.540, 2.282, 2.235,, 2.235, CRC32C + 128, 2.384, 1.821, 2.302,, 1.821, Multiword + 256, 2.351, 1.650, 2.249,, 1.650, Multiword + 512, 2.323, 1.519, 1.526,, 1.519, Multiword + 1024, 2.329, 1.473, 1.462,, 1.462, CRC32C + 2048, 2.303, 1.444, 1.447,, 1.444, Multiword + 4096, 2.297, 1.439, 1.417,, 1.417, CRC32C + 8192, 2.292, 1.431, 1.416,, 1.416, CRC32C + 16384, 2.294, 1.441, 1.423,, 1.423, CRC32C + 32768, 2.296, 1.445, 1.317,, 1.317, CRC32C + 65536, 1.783, 1.446, 1.319,, 1.319, CRC32C + 131072, 1.775, 1.445, 1.318,, 1.318, CRC32C + 262144, 1.634, 1.445, 1.317,, 1.317, CRC32C + 524288, 1.570, 1.445, 1.319,, 1.319, CRC32C + 1048576, 1.581, 1.458, 1.319,, 1.319, CRC32C + 2097152, 1.575, 1.469, 1.337,, 1.337, CRC32C + 4194304, 1.582, 1.476, 1.349,, 1.349, CRC32C + 8388608, 1.682, 1.589, 1.461,, 1.461, CRC32C + 16777216, 1.684, 1.597, 1.469,, 1.469, CRC32C + 33554432, 1.690, 1.598, 1.467,, 1.467, CRC32C + 67108864, 1.693, 1.604, 1.474,, 1.474, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-4-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 32, 4, 4, 4, 4, 0, 8528, 1104507 + +, MemSpeed, Byte, ByteUnrolled, ByteWord, Word, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 6.752, 6.511, 6.053, 7.464, 6.251, 7.182, 6.766, 7.729,, 6.053, ByteUnrolled + 8, 3.751, 6.085, 6.135, 6.463, 4.295, 4.641, 4.626, 3.720,, 3.720, CRC32C + 16, 1.501, 6.784, 6.815, 6.085, 3.334, 3.867, 3.680, 2.906,, 2.906, CRC32C + 32, 0.876, 7.133, 7.128, 6.288, 3.163, 3.438, 2.922, 2.297,, 2.297, CRC32C + 64, 0.563, 7.303, 7.256, 6.217, 2.992, 3.282, 2.204, 2.219,, 2.204, Multiword + 128, 0.413, 7.404, 7.363, 6.208, 2.939, 3.161, 1.841, 2.324,, 1.841, Multiword + 256, 0.342, 7.578, 7.428, 6.286, 2.930, 3.141, 1.678, 2.248,, 1.678, Multiword + 512, 0.306, 7.530, 7.547, 6.275, 2.929, 3.116, 1.586, 1.530,, 1.530, CRC32C + 1024, 0.295, 7.524, 7.531, 6.285, 2.937, 3.088, 1.536, 1.463,, 1.463, CRC32C + 2048, 0.298, 7.535, 7.510, 6.285, 2.931, 3.073, 1.517, 1.449,, 1.449, CRC32C + 4096, 0.289, 7.529, 7.522, 6.279, 2.957, 3.065, 1.505, 1.415,, 1.415, CRC32C + 8192, 0.281, 7.407, 7.406, 6.275, 2.942, 3.057, 1.497, 1.415,, 1.415, CRC32C + 16384, 0.284, 7.454, 7.395, 6.273, 2.934, 3.055, 1.497, 1.423,, 1.423, CRC32C + 32768, 0.286, 7.344, 7.389, 6.274, 2.918, 3.083, 1.509, 1.317,, 1.317, CRC32C + 65536, 0.307, 7.335, 7.400, 6.271, 2.907, 1.759, 1.510, 1.320,, 1.320, CRC32C + 131072, 0.307, 7.252, 7.426, 6.272, 2.898, 1.746, 1.511, 1.318,, 1.318, CRC32C + 262144, 0.307, 7.601, 7.539, 6.310, 2.913, 1.743, 1.510, 1.316,, 1.316, CRC32C + 524288, 0.307, 7.640, 7.567, 6.358, 2.949, 1.741, 1.510, 1.318,, 1.318, CRC32C + 1048576, 0.308, 7.667, 7.595, 6.382, 2.986, 1.667, 1.522, 1.321,, 1.321, CRC32C + 2097152, 0.310, 7.678, 7.612, 6.401, 3.004, 1.679, 1.535, 1.342,, 1.342, CRC32C + 4194304, 0.313, 7.689, 7.617, 6.407, 3.009, 1.691, 1.545, 1.347,, 1.347, CRC32C + 8388608, 0.546, 7.903, 7.810, 6.581, 3.143, 1.793, 1.643, 1.463,, 1.463, CRC32C + 16777216, 0.554, 7.878, 7.832, 6.602, 3.147, 1.797, 1.646, 1.466,, 1.466, CRC32C + 33554432, 0.557, 7.915, 7.841, 6.605, 3.150, 1.799, 1.650, 1.468,, 1.468, CRC32C + 67108864, 0.556, 7.918, 7.841, 6.616, 3.150, 1.804, 1.655, 1.476,, 1.476, CRC32C + +ClassTitle, CRC-32-u32/u32/u32-3-canonical + Compiler, CpuBits, Degree, Crc, TableEntry, Word, Stride, Alignment, TableBytes, InitCycles + ICL-1110, 64, 32, 4, 4, 4, 3, 0, 8528, 1112589 + +, Blockword, Multiword, CRC32C,, BestTime, BestMethod + 4, 7.220, 6.817, 7.869,, 6.817, Multiword + 8, 4.651, 4.501, 3.703,, 3.703, CRC32C + 16, 3.888, 3.796, 2.904,, 2.904, CRC32C + 32, 3.482, 2.881, 2.297,, 2.297, CRC32C + 64, 3.266, 2.117, 2.219,, 2.117, Multiword + 128, 3.176, 1.860, 2.324,, 1.860, Multiword + 256, 3.091, 1.668, 2.240,, 1.668, Multiword + 512, 3.170, 1.600, 1.531,, 1.531, CRC32C + 1024, 3.156, 1.562, 1.463,, 1.463, CRC32C + 2048, 3.082, 1.545, 1.449,, 1.449, CRC32C + 4096, 3.072, 1.526, 1.414,, 1.414, CRC32C + 8192, 3.067, 1.522, 1.416,, 1.416, CRC32C + 16384, 3.074, 1.520, 1.423,, 1.423, CRC32C + 32768, 3.120, 1.539, 1.317,, 1.317, CRC32C + 65536, 2.109, 1.540, 1.320,, 1.320, CRC32C + 131072, 2.087, 1.541, 1.318,, 1.318, CRC32C + 262144, 1.841, 1.541, 1.316,, 1.316, CRC32C + 524288, 1.716, 1.541, 1.317,, 1.317, CRC32C + 1048576, 1.739, 1.550, 1.326,, 1.326, CRC32C + 2097152, 1.712, 1.567, 1.342,, 1.342, CRC32C + 4194304, 1.715, 1.575, 1.347,, 1.347, CRC32C + 8388608, 1.805, 1.675, 1.463,, 1.463, CRC32C + 16777216, 1.815, 1.679, 1.469,, 1.469, CRC32C + 33554432, 1.813, 1.681, 1.472,, 1.472, CRC32C + 67108864, 1.816, 1.686, 1.473,, 1.473, CRC32C + diff --git a/crcutil-1.0/doc/text/CRC128-full.pdf b/crcutil-1.0/doc/text/CRC128-full.pdf new file mode 100644 index 0000000..c30c1e9 Binary files /dev/null and b/crcutil-1.0/doc/text/CRC128-full.pdf differ diff --git a/crcutil-1.0/doc/text/CRC128-small.pdf b/crcutil-1.0/doc/text/CRC128-small.pdf new file mode 100644 index 0000000..d39a874 Binary files /dev/null and b/crcutil-1.0/doc/text/CRC128-small.pdf differ diff --git a/crcutil-1.0/doc/text/CRC32-full.pdf b/crcutil-1.0/doc/text/CRC32-full.pdf new file mode 100644 index 0000000..b175274 Binary files /dev/null and b/crcutil-1.0/doc/text/CRC32-full.pdf differ diff --git a/crcutil-1.0/doc/text/CRC32-small.pdf b/crcutil-1.0/doc/text/CRC32-small.pdf new file mode 100644 index 0000000..400f25f Binary files /dev/null and b/crcutil-1.0/doc/text/CRC32-small.pdf differ diff --git a/crcutil-1.0/doc/text/CRC64-full.pdf b/crcutil-1.0/doc/text/CRC64-full.pdf new file mode 100644 index 0000000..95b6fea Binary files /dev/null and b/crcutil-1.0/doc/text/CRC64-full.pdf differ diff --git a/crcutil-1.0/doc/text/CRC64-small.pdf b/crcutil-1.0/doc/text/CRC64-small.pdf new file mode 100644 index 0000000..817e5ee Binary files /dev/null and b/crcutil-1.0/doc/text/CRC64-small.pdf differ diff --git a/crcutil-1.0/doc/text/CompilerComparison.pdf b/crcutil-1.0/doc/text/CompilerComparison.pdf new file mode 100644 index 0000000..4f6c045 Binary files /dev/null and b/crcutil-1.0/doc/text/CompilerComparison.pdf differ diff --git a/crcutil-1.0/doc/text/convert.awk b/crcutil-1.0/doc/text/convert.awk new file mode 100644 index 0000000..01b8986 --- /dev/null +++ b/crcutil-1.0/doc/text/convert.awk @@ -0,0 +1,18 @@ +BEGIN { + first_line = 1; +} + +{ + if (first_line) { + printf("%20s", ""); + } + for (i = 1; i <= NF; ++i) { + if (i == 1 && !first_line) { + printf("%20s", $i); + } else { + printf(" &%6s", $i); + } + } + printf(" \\\\\n"); + first_line = 0; +} diff --git a/crcutil-1.0/doc/text/crc.bib b/crcutil-1.0/doc/text/crc.bib new file mode 100644 index 0000000..cf7bd1a --- /dev/null +++ b/crcutil-1.0/doc/text/crc.bib @@ -0,0 +1,198 @@ +@InProceedings{braun01fast, + Author = {Florian Braun and Marcel Waldvogel}, + Title = {Fast Incremental {CRC} Updates for {IP} over {ATM} + networks}, + BookTitle = {2001 {IEEE} Workshop on High + Performance Switching and Routing (HPSR 2001)}, + Address = {Dallas, TX, USA}, + Year = 2001, + Month = may, + Pages = {48--52} +} + +@TechReport{braun01fast-techreport, + Author = {Florian Braun and Marcel Waldvogel}, + Title = {Fast Incremental {CRC} Updates for {IP} over {ATM} + networks}, + Institution = {Washington University in St.\ Louis}, + Number = {WUCS-01-08}, + Year = 2001, + Month = apr, + Note = {Available at \url{http://marcel.wanda.ch/Publications/braun01fast-techreport.pdf}} +} + +@article{DBLP:journals/tc/KounavisB08, + author = {Michael E. Kounavis and + Frank L. Berry}, + title = {Novel Table Lookup-Based Algorithms for High-Performance + {CRC} Generation}, + journal = {IEEE Trans. Computers}, + volume = {57}, + number = {11}, + year = {2008}, + pages = {1550-1560}, + ee = {http://dx.doi.org/10.1109/TC.2008.85}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + + +@inproceedings{DBLP:conf/iscc/KounavisB05, + author = {Michael E. Kounavis and + Frank L. Berry}, + title = {A Systematic Approach to Building High Performance Software-Based + {CRC} Generators}, + booktitle = {ISCC}, + year = {2005}, + pages = {855-862}, + ee = {http://doi.ieeecomputersociety.org/10.1109/ISCC.2005.18}, + crossref = {DBLP:conf/iscc/2005}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@misc{Kounavis2005, + author = {Michael E. Kounavis and + Frank L. Berry}, + title = {A Systematic Approach to Building High Performance, Software-Based, + {CRC} Generators}, + year = {2005}, + howpublished={\url{http://www.intel.com/technology/comms/perfnet/download/CRC_generators.pdf}}, +} + +@proceedings{DBLP:conf/iscc/2005, + title = {Proceedings of the 10th {IEEE} Symposium on Computers and + Communications ({ISCC} 2005), 27-30 June 2005, Murcia, Cartagena, + Spain}, + booktitle = {ISCC}, + publisher = {{IEEE} Computer Society}, + year = {2005}, + isbn = {0-7695-2373-0}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@article{DBLP:journals/cacm/Sarwate88, + author = {Dilip V. Sarwate}, + title = {Computation of Cyclic Redundancy Checks via Table Look-Up}, + journal = {Commun. {ACM}}, + volume = {31}, + number = {8}, + year = {1988}, + pages = {1008-1013}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@article{Perez83, + author = {Perez, Aram}, + title = {Byte-Wise {CRC} Calculations}, + journal = {{IEEE} Micro}, + volume = {3}, + number = {3}, + year = {1983}, + issn = {0272-1732}, + pages = {40--50}, + doi = {http://dx.doi.org/10.1109/MM.1983.291120}, + publisher = {{IEEE} Computer Society Press}, + address = {Los Alamitos, CA, USA}, +} + +@article{Ramabadran88, + author = {Ramabadran, Tenkasi V. and Gaitonde, Sunil S.}, + title = {A Tutorial on {CRC} Computations}, + journal = {IEEE Micro}, + volume = {8}, + number = {4}, + year = {1988}, + issn = {0272-1732}, + pages = {62--75}, + doi = {http://dx.doi.org/10.1109/40.7773}, + publisher = {IEEE Computer Society Press}, + address = {Los Alamitos, CA, USA}, +} + +@inproceedings{DBLP:conf/icc/JoshiDK00, + author = {Sanjay M. Joshi and + Pradeep K. Dubey and + Marc A. Kaplan}, + title = {A New Parallel Algorithm for {CRC} Generation}, + booktitle = {{ICC} (3)}, + year = {2000}, + pages = {1764-1768}, + bibsource = {DBLP, http://dblp.uni-trier.de} +} + +@misc{Black93, + author = {Richard Black}, + title = {Fast {CRC32} in Software}, + year = {1993}, + howpublished = {\url{http://www.cl.cam.ac.uk/research/srg/bluebook/21/crc/crc.html}}, +} + +@misc{Zemtsov90, + author = {Pavel Zemtsov}, + title = {Proprietary copy protection system}, + year = {1990}, + month = aug, + howpublished = {Personal communication} +} + +@article{Hill79, + author = {Hill, John R.}, + title = {A table driven approach to cyclic redundancy check calculations}, + journal = {{SIGCOMM} Comput. Commun. Rev.}, + volume = {9}, + number = {2}, + year = {1979}, + issn = {0146-4833}, + pages = {40--60}, + doi = {http://doi.acm.org/10.1145/1015860.1015862}, + publisher = {ACM}, + address = {New York, NY, USA}, +} + +@InProceedings{Peterson61, + Author = {W.W. Peterson and D.T. Brown}, + Title = {Cyclic Codes for Error Detection}, + BookTitle = {{IRE(1)}}, + Volume = {49}, + Year = {1961}, + Month = jan, + Pages = {228--235} +} + +@InProceedings{JiKillian02, + Author = {H. Michael Ji and Eeal Killian}, + Title = {Fast Parallel CRC Algorithm and Implementation on a Configurable Processor}, + BookTItle = {{ICC}}, + Volume = {3}, + Year = {2002}, + Month = apr, + Pages = {1813–-1817} +} + +@inproceedings{Hasan01, + author = {Hasan, M. A.}, + title = {Efficient Computation of Multiplicative Inverses for Cryptographic Applications}, + booktitle = {ARITH '01: Proceedings of the 15th IEEE Symposium on Computer Arithmetic}, + year = {2001}, + pages = {66}, + publisher = {IEEE Computer Society}, + address = {Washington, DC, USA}, +} + + +@Misc{Gopal2010, + Author = { + Vinodh Gopal and + Jim Guilford and + Erdinc Ozturk and + Gil Wolrich and + Wajdi Feghali and + Martin Dixon and + Deniz Karakoyunlu + }, + Title = {Fast {CRC} Computation for {iSCSI} Polynomial Using {CRC32} Instruction}, + Howpublished = {Intel White Paper 323405}, + Year = 2010, + Month = feb, + Note = {Available at \url{http://download.intel.com/design/intarch/papers/323405.pdf}}, +} + diff --git a/crcutil-1.0/doc/text/crc.tex b/crcutil-1.0/doc/text/crc.tex new file mode 100644 index 0000000..96becb9 --- /dev/null +++ b/crcutil-1.0/doc/text/crc.tex @@ -0,0 +1,1513 @@ +\documentclass{article} + +\usepackage{listings} +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage{url} +\usepackage{authblk} +\usepackage{array} \setlength{\extrarowheight}{1.5pt} + + +\begin{document} + +\lstset{ +%language=C++, % choose the language of the code +basicstyle=\footnotesize, % code font size +numbers=left, % where to put the line-numbers +numberstyle=\footnotesize, % line number font size +stepnumber=1, % the step between two line-numbers. +%backgroundcolor=\color{white}, % choose the background color +frame=single, +framerule=1pt, +captionpos=b, % t or b +showstringspaces=false, % underline spaces within strings +showspaces=false, % show spaces within strings with underscores +showtabs=false, % show tabs within strings with underscores +breaklines=true % Break long lines of code +} + +\def\CRC{{\rm CRC}_u} +\def\SCRC{{\rm CRC}_0} +\def\BYTE{{\rm BYTE}} +\def\LCD{{\rm LCD}} +\def\CrcWord{{\rm CrcWord}} + +\def\remove#1{} + +% ----------------------------------------- +\title{Everything we know about CRC but afraid to forget} +\author[1]{Andrew Kadatch} +\affil[1]{Google Inc.} +\author[2]{Bob Jenkins} +\affil[2]{Microsoft Corporation} +\maketitle + +\begin{abstract} + This paper describes a novel interleaved, parallelizeable word-by-word + CRC computation algorithm which computes $N$-bit CRC ($N \leq 64$) on + modern Intel and AMD processors in 1.2 CPU cycles per byte, improving + state of the art over word-by-word 32-bit and 64-bit CRCs (2.1 CPU + cycles/byte) and classic byte-by-byte CRC computation (6-7 CPU cycles/byte). + It computes 128-bit CRC in 1.7 CPU cycles/byte. + + CRC implementations are heavily optimized and hard to understand. This + paper describes CRC algorithms as they evolved over time, splitting + complex optimizations into a sequence of natural improvements. + + This paper also presents a collection of CRC ``tricks" that we found + handy on many occassions. +\end{abstract} + +\tableofcontents + + +% ----------------------------------------- +\section{Definition of CRC} + +Cyclic Redundancy Check (CRC) is a well-known technique that allows the +recipient of a message transmitted over a noisy channel to detect whether +the message has been corrupted. + +A message $M = m_0 \dots m_{N-1}$ comprised of $N=|M|$ bits ($m_k \in \{0, +1\}$) may be viewed either as a numeric value + \begin{align*} + M = \sum_{k=0}^{N-1} m_k 2^{N-1-k} + \end{align*} +or as a polynomial of a single variable of degree $(N-1)$ + \begin{align*} + M(x) = \sum_{k=0}^{N-1} m_k x^{N-1-k} + \end{align*} +where $m_k \in GF(2) = \{0, 1\}$ and all arithmetic operations on +coefficients are performed modulo 2. For example, + \begin{align*} + & \mbox{Addition: } + (x^3+x^2+x+1) + (x^2+x+1) = x^3+2x^2+2x+2 = x^3, \\ + & \mbox{Subtraction: } + (x^3+x+1) - (x^2+x) = x^3-x^2+1 = x^3+x^2+1, \\ + & \mbox{Multiplication: } + (x+1)(x+1) = x^2 + 2x + 1 = x^2 + 1. + \end{align*} + +For a given polynomial $P(x)$ of degree $D=\deg\bigl(P(x)\bigr)$, +$\CRC\bigl(M(x),v(x)\bigr)$ is the reminder from division of $\left(M(x) +\cdot x^D\right)$ by $P(x)$. In practice, a more complex formula is used: + \begin{align} + \label{e:crcdefinition} + \CRC\bigl(M(x), v(x)\bigr) + = \Bigl(\bigl(v(x)-u(x)\bigr) \cdot x^{|M|} + M(x) \cdot x^D + u(x)\Bigr) + \bmod P(x), + \end{align} +where polynomial $P(x)$ of degree $D$ and polynomial $u(x)$ of degree less +than $D$ are fixed. + +The use of the non-zero value of $u(x)$ guarantees that the CRC of a sequence +of zeroes is different from zero. That allows detection of insertion of +zeroes in the beginning of a message and replacement of both content of the +message and its CRC value with zeroes. Typically, + \begin{align} + \label{e:constdefinition} + u(x) &= \sum_{k=0}^{D-1} x^k. + \end{align} + +The use of auxilary parameter $v(x)$ allows incremental CRC computation +as shown in section \ref{s:incrementalcrc}. + +% ----------------------------------------- +\section{Related work} + +Cyclic Redundancy Checks (CRCs) were proposed by Peterson and Brown +\cite{Peterson61} in 1961. An efficient table-driven software +implementation which reads and processes data byte by byte was described by +Hill \cite{Hill79} in 1979, Perez \cite{Perez83} in 1983. The ``classic" +byte-by-byte CRC algorithm described in section \ref{s:crcbyte} was +published by Sarwate \cite{DBLP:journals/cacm/Sarwate88} in 1988. + +In 1993, Black \cite{Black93} published a method that reads data by words +(described in section \ref{s:crcbyteword}); however, it still computes the +CRC byte by byte in strong sequential order. + +In 2001, Braun and Waldvogel \cite{\remove{%braun01fast, +}braun01fast-techreport} briefly outlined a specialized variant of a CRC +that could read input data by words and process them byte by byte -- but, +thanks to the use of multiple tables, different bytes from the input word +could be processed in parallel. In 2002, Ji and Killian \cite{JiKillian02} +provided detailed description and analysis of a nearly identical scheme. +Both solutions were targeted for hardware implementation. In 2005, Kouvanis +and Berry \cite{Kounavis2005\remove{, DBLP:conf/iscc/KounavisB05, +DBLP:journals/tc/KounavisB08}} demonstrated clear performance benefits of +this scheme even when it is implemented in software. A generalized version +of this approach is described in section \ref{s:crcword}. + +Surprisingly, until \cite{Gopal2010} we have not seen prior art describing +or utilizing a method of computing a CRC by processing in parallel (in an +interleaved manner to utilize multiple ALUs) multiple input streams +belonging to non-overlapping sections of input data, desribed in section +\ref{s:blockword}. + +A novel method of CRC computation that processes in parallel multiple words +belonging to overlapping sections of input data is described in section +\ref{s:multiword}. A special case restricted to the use of 64-bit tables, +64-bit reads, and 32 or 64-bit generating polynomials was implemented by +the authors in February-March 2007 and was used by a couple of Microsoft +products. In 2009, the algorithm was generalized and these limitations were +removed. + +The fact that the CRC of a message followed by its CRC is a constant value +which does not depend on the message, described in section +\ref{s:storingcrcafter}, is well known and has been widely used in the +telecommunication industry for long time. + +A method of storing a carefully chosen sequence of bits after a message so +that the CRC of a message and the sequence of bits appended to the message +produces predefined result, described in \ref{s:storingcrcafter}, was +implemented in 1990 by Zemtsov \cite{Zemtsov90}. + +A method for recomputing a known CRC using a new initial CRC value, +described in section \ref{s:changinginitialvalue}, and the method of +computing a CRC of the concatenation of messages having known CRC values +without touching the actual data, described in section +\ref{s:concatenation}, were implemented by one of the authors in 2005 but +were not published. + + +% ----------------------------------------- +\section{CRC tricks and tips} + + +% ----------------------------------------- +\subsection{Incremental CRC computation} \label{s:incrementalcrc} + +The use of an arbitrary initial CRC value $v(x)$ allows computation of a CRC +incrementally. If a message + $M(x) = M_1(x) \cdot x^{|M_2|} + M_2(x)$ +is a concatenation of messages $M_1$ and $M_2$, its CRC may be computed +piece by piece because + \begin{align} + \label{e:incremental} + \CRC\bigl(M(x), v(x)\bigr) + &= \CRC\Bigl(M_2(x), \CRC\bigl(M_1(x), v(x)\bigr)\Bigr). + \end{align} + +Indeed, + \begin{align*} + \CRC(M, v) + &= \bigl((v-u) x^{|M|} + M x^D + u\bigr) \bmod P = \\ + &= \bigl((v-u) x^{|M_1|+|M_2|} + (M_1 x^{|M_2|} + M_2) x^D + u\bigr) \bmod P = \\ + &= \Bigl(\bigl((v-u) x^{|M_1|} + M_1 x^D \bigr) x^{|M_2|} + M_2 x^D + u\Bigr) \bmod P = \\ + &= \bigl(\CRC(M_1, v) x^{|M_2|} + M_2 x^D + u\bigr) \bmod P = \\ + &= \CRC\bigl(M_2, \CRC(M_1, v)\bigr) + \end{align*} + + +% ----------------------------------------- +\subsection{Changing initial CRC value} \label{s:changinginitialvalue} + +If + $\CRC\bigl(M(x), v(x)\bigr)$ +for some initial value $v(x)$ is known, it is possible to compute + $\CRC\bigl(M(x), v'(x)\bigr)$ +for different initial value $v'(x)$ without touching the value of $M(x)$: + \begin{align} + \CRC(M, v') + &= \CRC(M,v) + \Bigl((v'-v) x^{|M|}\Bigr) \bmod P. + \label{e:fixv} + \end{align} + +Proof: + \begin{align*} + \CRC(M, v') + &= \bigl((v'-u) x^{|M|} + M x^D + u\bigr) \bmod P = \\ + &= \Bigl(\bigl((v'-u)+(v-v)\bigr) x^{|M|} + M x^D + u\Bigr) \bmod P = \\ + &= \Bigl(\bigl((v-u)+(v'-v)\bigr) x^{|M|} + M x^D + u\Bigr) \bmod P = \\ + &= \Bigl(\bigl((v-u) x^{|M|} + M x^D + u\bigr) + (v'-v) x^{|M|}\Bigr) \bmod P = \\ + &= \CRC(M,v) + \Bigl((v'-v) x^{|M|} \bmod P \Bigr). + \end{align*} + + +% ----------------------------------------- +\subsection{Concatenation of CRCs} \label{s:concatenation} + +If a message + $M(x) = M_1(x) \cdot x^{|M_2|} + M_2(x)$ +is a concatenation of messages $M_1$ and $M_2$, and CRCs of $M_1$, $M_2$ +(computed with some initial values $v_1(x)$, $v_2(x)$ respectively) are +known, + $\CRC\bigl(M(x),v(x)\bigr)$ +may be computed without touching contents of the message $M$: +\begin{enumerate} +\item + Using formula (\ref{e:fixv}), the value of $v'_1 = \CRC(M_1,v)$ may + be computed from the known $\CRC(M_1,v_1)$ without touching the contents of $M_1$. +\item + Then, $v'_2 = \CRC(M_2, v'_1)$ may be computed from known $\CRC(M_2,v_2)$ + without touching the contents of $M_2$. +\end{enumerate} +According to (\ref{e:incremental}), $\CRC(M,v) = v'_2$. + + + +% ----------------------------------------- +\subsection{In-place modification of CRC-ed message} \label{s:replacement} + +Sometimes it is necessary to replace a part of message $M(x)$ in-place and +recompute CRC of modified message $M(x)$ efficiently. + +If a message $M=ABC$ is a concatenation of messages $A$, $B$, and $C$, and +$B'(x)$ is new message of the same length as $B(x)$, $\CRC(M')$ of message +$M'=AB'C$ may be computed from known $\CRC(M)$. Indeed, + \begin{align*} + M(x) &= A(x) \cdot x^{|B| + |C|} + B(x) \cdot x^{|C|} + C(x), \\ + M'(x) &= A(x) \cdot x^{|B| + |C|} + B'(x) \cdot x^{|C|} + C(x) = \\ + &= M(x) + \bigl(B'(x) - B(x)\bigr) \cdot x^{|C|}, + \end{align*} +therefore + \begin{align*} + & \CRC\bigl(M'(x),v(x)\bigr) = \\ + &= \CRC\Bigl(M(x) +\bigl(B'(x) - B(x)\bigr) \cdot x^{|C|}\Bigr) = \\ + &= \Bigl(\bigl(v(x)-u(x)\bigr) x^{|M|} + M(x) x^D + \bigl(B'(x) - B(x)\bigr) x^{|C| + D} + u(x)\Bigr) \bmod P(x) \\ + &= \Bigl(\CRC\bigl(M(x),v(x)\bigr) + \bigl(B'(x) - B(x)\bigr) x^{|C| + D}\Bigr) \bmod P(x) = \\ + &= \CRC\bigl(M(x),v(x)\bigr) + \Bigl(\bigl(B'(x) - B(x)\bigr) x^{|C| + D} \bmod P(x)\Bigr). + \end{align*} + +It is easy to see that + \begin{align*} + & \CRC\bigl(B'(x),v(x)\bigr) - \CRC\bigl(B(x),v(x)\bigr) = \\ + &= \bigl(B'(x) - B(x)\bigr) x^{D} \bmod P(x), + \end{align*} +so + \begin{align*} + & \CRC\bigl(M'(x),v(x)\bigr) = \CRC\bigl(M(x),v(x)\bigr) + \Delta \\ + \end{align*} +where + \begin{align*} + & \Delta = \Bigl(\CRC\bigl(B'(x),v(x)\bigr) - \CRC\bigl(B(x),v(x)\bigr) \Bigr) x^{|C|} \bmod P(x). + \end{align*} + +% ----------------------------------------- +\subsection{Storing CRC value after the message} \label{s:storingcrcafter} + +Often $Q(x) = \CRC\bigl(M(x),v(x)\bigr)$ is padded with zero bits until the +nearest byte or word boundary and is transmitted as a sequence of $W$ bits +($W \geq D$) right after the message $M(x)$. This way, the transmitted +message $T(x)$ is the concatenation of $M(x)$ and $Q(x)$ followed by +$(W-D)$ zeroes, and is equal to + \begin{align*} + T(x) = M(x) \cdot x^W + Q(x) \cdot x^{W-D}. + \end{align*} + +According to (\ref{e:crcdefinition}), (\ref{e:incremental}) and taking into +account that $Q(x)+Q(x) = 0$ since polynomial coefficient are from $GF(2)$, +$\CRC\bigl(T(x), v(x)\bigr)$ is a constant value which does not depend on +the contents of the message and is equal to + \begin{align*} + & \CRC\bigl(T(x), v(x)\bigr) = \\ + & = \CRC\Bigl(Q(x) \cdot x^{W-D}, CRC\bigl(M(x), v(x)\bigr)\Bigr) = \\ + & = \CRC\bigl(Q(x) \cdot x^{W-D}, Q(x)\bigr) = \\ + & = \Bigl(\bigl(Q(x)-u(x)\bigr) \cdot x^W + Q(x)\cdot x^{W-D} \cdot x^D + u(x)\Bigr) + \bmod P(x) = \\ + & = \Bigl(u(x)\left(1 - x^W\right)\Bigr) \bmod P(x). + \end{align*} + +A more generic solution is to store a $W$-bit long value after the message +such that the CRC of the transmitted message is equal to a predefined value +$R(x)$ (typically $R(x)=0$). The $D$-bit value followed by $(W-D)$ zero +bits that should be stored after $M(x)$ is + \begin{align*} + \hat{q}\bigl(Q(x)\bigr) = \Bigl(\bigl(R(x) - u(x)\bigr) x^{-W} - \bigl(Q(x) - u(x)\bigr)\Bigr) \bmod P(x) + \end{align*} +where $x^{-W}$ is the multiplicative inverse of $x^W \bmod P(x)$ which +exists if $P(x)$ is not divisble by $x$ and may be found by the extended +Euclidean algorithm \cite{Hasan01}: + \begin{align*} + & \CRC\Bigl(\hat{q}\bigl(Q(x)\bigr)x^{W-D}, CRC\bigl(M(x), v(x)\bigr)\Bigr) = \\ + & = \CRC\Bigl(\hat{q}\bigl(Q(x)\bigr)x^{W-D}, Q(x)\Bigr) = \\ + & = \Bigl(\bigl(Q(x)-u(x)\bigr) \cdot x^W + \hat{q}\bigl(Q(x)\bigr) \cdot x^{W-D} \cdot x^D + u(x)\Bigr) + \bmod P(x) = \\ + & = R(x). + \end{align*} + + +% ----------------------------------------- +\section{Efficient software implementation} + +% ----------------------------------------- +\subsection{Mapping bitstreams to hardware registers} + +For little-endian machines (assumed from now on), the result of loading of +a $D$-bit word from memory into hardware register matches the expectations: +the 0-th bit of the 0-th byte becomes the 0-th (least significant) bit of +the word corresponding to $x^{(D-1)}$. + +For example, the 32-bit sequence of 4 bytes 0x01, 0x02, 0x03, 0x04 +(0x04030201 when loaded into a 32-bit hardware register) corresponds to the +polynomial + \begin{align*} + \left(x^{31} + x^{22} + x^{15} + x^{14} + x^{5}\right). + \end{align*} + +Addition and subtraction of polymonials with coefficients from $GF(2)$ is +the bitwise XOR of their coefficients. Multiplication of a polynomial by +$x$ is achieved by logical right shift of register contents by 1 bit. If a +shift operation causes a carryover, the resulting polynomial has degree +$D$. + +Polynomials of degree less than $D$ whose coefficients are recorded using +exactly $D$ bits irrespective of actual degree of the polynomial will be +called {\it $D$-normalized}. + +Whenever possible -- and unless mentioned explicitly -- all polynomials +will be represented in $D$-normalized form. + +Since the generating polynomial $P(x)$ is of degree $D$ and has $(D+1)$ +coefficients, it does not fit into the $D$-bit register. However, its most +significant coefficient is guaranteed to be 1 and may be implied +implicitly. + +% ----------------------------------------- +\subsection{Multiplication of $D$-normalized polynomials} \label{s:shiftandadd} + +Multiplication of two $D$-normalized polynomials may be accomplished by +traditional bit-by-bit, shift-and-add multiplication. This is adequate if +performance is not a concern. Sample code is given in listing +\ref{l:MulNormalizedPoly}. + +\begin{figure} +\begin{lstlisting}[caption={Multiplication of normalized polynomials},label={l:MulNormalizedPoly}] +// "a" and "b" occupy D least significant bits. +Crc Multiply(Crc a, Crc b) { + Crc product = 0; + Crc bPowX[D]; // bPowX[k] = (b * x**k) mod P + bPowX[0] = b; + for (int k = 0; k < D; ++k) { + // If "a" has non-zero coefficient at x**k, + // add ((b * x**k) mod P) to the result. + if (((a & (1 << (D-k)) != 0) product ^= bPowX[k]; + + // Compute bPowX[k+1] = (b ** x**(k+1)) mod P. + if (bPowX[k] & 1) { + // If degree of (bPowX[k] * x) is D, then + // degree of (bPowX[k] * x - P) is less than D. + bPowX[k+1] = (bPowX[k] >> 1) ^ P; + } else { + bPowX[k+1] = bPowX[k] >> 1; + } + } + return product; +} +\end{lstlisting} +\end{figure} + +% ----------------------------------------- +\subsection{Multiplication of unnormalized polynomial} + +During initialization of CRC tables it may be necessary to multiply +$d$-normalized polynomial $v(x)$ of a degree $d \neq D$ by a $D$-normalized +polynomial. It may be accomplished by representing the operand as a sum of +weighted polynomials of degree of no more than $(D-1)$, then calling +$Multiply()$ function repeatedly as shown in listing +\ref{l:MulUnnormalizedPoly}. + +\begin{figure} +\begin{lstlisting}[caption={Multiplication of unnormalized polynomial},label={l:MulUnnormalizedPoly}] +// "v" occupies "d" least signficant bits. +// "m" occupies D least significant bits. +Crc MultiplyUnnormalized(Crc v, int d, Crc m) { + Crc result = 0; + while (d > D) { + Crc temp = v & ((1 << D) - 1); + v >>= D; + d -= D; + // XpowN returns (x**N mod P(x)). + result ^= Multiply(temp, Multiply(m, XpowN(d))); + } + result ^= Multiply(v << (D - d), m); + return result; +} +\end{lstlisting} +\end{figure} + + +% ----------------------------------------- +\subsection{Computing powers of $x$} \label{s:mulpown} + +Often (see sections \ref{s:changinginitialvalue}, \ref{s:concatenation}, +\ref{s:storingcrcafter}) it is necessary to compute $x^N \bmod P(x)$ for +very large values of $N$. This may be accomplished in +$O\bigl(\log(N)\bigr)$ time. + +Consider the binary representation of $N$: + \begin{align*} + N = \sum_{k=0}^K n_k 2^k + \end{align*} +where $n_k \in \{0, 1\}$. Then + \begin{align} + x^N &= x^{\sum n_k 2^k} + = \prod_{k=0}^K x^{n_k 2^k} + = \prod_{n_k != 0} x^{2^k} \label{e:pow2k} + \end{align} +and may be computed using no more than + $\left(\left\lfloor \log_2(N) \right\rfloor + 1\right)$ +multiplications of polynomials of degree less than $D$ provided known +values of + \begin{align} + Pow2k(k) = x^{2^k} \bmod P(x). + \end{align} + +Values of $Pow2k(k)$ may be computed iteratively using one multiplication +$\bmod P(x)$ per iteration: + \begin{align*} + Pow2k(0) &= 0, \\ + Pow2k(k + 1) + &= x^{2^{k+1}} \bmod P(x) = \\ + &= x^{2 \cdot 2^k} \bmod P(x) = \\ + &= \left(x^{2^k}\right)^2 \bmod P(x) = \\ + &= \Bigl(Pow2k(k-1)\Bigr)^2 \bmod P(x). + \end{align*} + +% ----------------------------------------- +\subsection{Simplified CRC} + +It is sufficient to be able to compute + \begin{align} + \SCRC\bigl(M(x), v(x)\bigr) + &= \Bigl(v(x) \cdot x^{|M|} + M(x) \cdot x^D\Bigr) + \bmod P(x), \label{e:simplifiedcrc} + \end{align} +since + \begin{align*} + \CRC\bigl(M(x),v(x)\bigr) &= \SCRC\bigl(M(x), v(x) - u(x)\bigr) + u(x), + \end{align*} +$\CRC\bigl(M(x),v(x)\bigr)$ of message $M = M_1 \ldots M_K$ may be computed +incrementally using $\SCRC$ instead of $\CRC$: + \begin{align*} + v_0(x) &= v(x) - u(x), \\ + v_k(x) &= \SCRC\bigl(M_k(x),v_{k-1}(x)\bigr), \\ + \CRC(M(x), v(x)) &= v_K + u(x). + \end{align*} + + +% ----------------------------------------- +\subsection{Computing a CRC byte by byte} \label{s:crcbyte} + +If $M(x)$ is $W$-bit value (typically, $W=8$) and +$\deg\bigl(v(x)\bigr) < D$, by definition (\ref{e:simplifiedcrc}) + \begin{align*} + \SCRC\bigl(M(x), v(x)\bigr) + = \Bigl(v(x) \cdot x^W + M(x) \cdot x^D\Bigr) \bmod P(x). + \end{align*} + +When $D \leq W$, +\begin{align} + \SCRC\bigl(M(x), v(x)\bigr) + &= \Bigl(v(x) \cdot x^W + M(x) \cdot x^D\Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(\bigl(v(x) \cdot x^{W-D} + M(x)\bigr) \cdot x^D\Bigr) \bmod P(x), \label{e:crcbytetable2} +\end{align} +which may be obtained via single lookup into precomputed table $T$ of size +$2^W$ such that $T[i] = \bigl(i(x) \cdot x^D)\bigr) \bmod P(x)$ since +$\deg\bigl(v(x) \cdot x^{W-D} + M(x)\bigr) < W$. + +$D$-normalized representation of $v(x)$ occupies $D$ least significant bits +and is equal to $\left(v(x) \cdot x^{W-D}\right)$ when viewed as +$W$-normalized representation which is required to form $W$-bit index into +a table of $2^W$ entries. Therefore, explicit multiplication of $v(x)$ by +$x^{W-D}$ in formula (\ref{e:crcbytetable2}) is not required. + +When $D \geq W$, $v(x)$ may be represented as + \begin{align*} + v(x) = v_L(x) + v_H(x) \cdot x^{D-W} + \end{align*} +where + \begin{align*} + v_H(x) &= \left\lfloor\frac{v(x)}{x^{D-W}}\right\rfloor, + &\deg\bigl(v_H(x)\bigr) &< W, \\ + v_L(x) &= v(x) \bmod x^{D-W}, + &\deg\bigl(v_L(x)\bigr) &< D-W. + \end{align*} + +Since $\deg\bigl(v_L(x) \cdot x^W \bigr) < D$, $\Bigl(v_L(x) \cdot +x^W\Bigr) \bmod P(x) = v_L(x) \cdot x^W$. Therefore, + \begin{align} + & \SCRC\bigl(M(x), v(x)\bigr) = \nonumber \\ + &= \Bigl(v(x) \cdot x^W + M(x) \cdot x^D\Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(\bigl(v_L(x) + v_H(x) \cdot x^{D-W}\bigr)\cdot x^W + M(x) \cdot x^D\Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(v_L(x) \cdot x^W + \bigl(v_H(x) + M(x)\bigr) \cdot x^D\Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(v_L(x) \cdot x^W + \bigl(v_H(x) + M(x)\bigr) \cdot x^D\Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(v_L(x) \cdot x^W\Bigr) \bmod P(x) + \Bigl(\bigl(v_H(x) + M(x)\bigr) \cdot x^D \Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(v_L(x) \cdot x^W\Bigr) + \mbox{MulByXpowD}\bigl(v_H(x) + M(x)\bigr), \label{e:crcbyte} + \end{align} +where + \begin{align} + \mbox{MulByXpowD}\bigl(a(x)\bigr) = \bigl(a(x) \cdot x^D \bigr) \bmod P(x). \label{e:crcbytetable} + \end{align} + +The value of $\bigl(v_L(x) \cdot x^W\bigr)$ may be computed by shifting +$v(x)$ by $W$ bits and discarding $W$ carry-over zero bits. + +Since $\deg\bigl(v_H(x) + M(x)\bigr) < W$, the value of +$\mbox{MulByXpowD}\bigl(v_H(x) + M(x)\bigr)$ may be obtained using +precomputed table containing $2^W$ entries. + +The classic table-driven, byte-by-byte CRC computation \cite{Perez83, +DBLP:journals/cacm/Sarwate88} implementing formulas +(\ref{e:crcdefinition}), (\ref{e:incremental}), (\ref{e:crcbytetable2}), +(\ref{e:crcbyte}), and (\ref{e:crcbytetable}) for $W=8$ is given in listing +\ref{l:CrcByte}. + +\begin{figure} +\begin{lstlisting}[caption={Computing CRC byte by byte},label={l:CrcByte}] +Crc CrcByte(Byte value) { + return MulByXpowD[value]; +} +Crc CrcByteByByte(Byte *data, int n, Crc v, Crc u) { + Crc crc = v ^ u; + for (int i = 0; i < n; ++i) { + Crc ByteCrc = CrcByte(crc ^ data[i]); + crc >>= 8; + crc ^= ByteCrc; + } + return (crc ^ u); +} +void InitByteTable() { + for (int i = 0; i < 256; ++i) { + MulByXPowD[i] = MultiplyUnnormalized(i, 8, XpowN(D)); + } +} +\end{lstlisting} +\end{figure} + +Experience shows that computing CRC byte by byte is rather slow and, +depending on a compiler and input data size, takes $6-8$ CPU cycles per +byte on modern 64-bit CPU for $D <= 64$. There are two reasons for it: + +\begin{enumerate} +\item + Reading data 8 bits at a time is not the most efficient data access + method on 64-bit CPU. +\item + Modern CPUs have multiple ALUs and may execute 3-4 instructions per CPU + cycles provided the instructions handle independent data flows. However, + byte-by-byte CRC contains only one data flow. Futhermore, most + instructions use the result from the previous instruction, leading to CPU + stalls because of result propagation delays. +\end{enumerate} + + +% ----------------------------------------- +\subsection{Rolling CRC} \label{s:rollingcrc} + +Given a set of messages $M_k=m_{k} \ldots m_{k+N-1}$ where $m_k$ are +$W$-bit symbols and $N$ is fixed (i.e. each next message is obtained by +removing first symbol and appending new one), $C_{k+1} = \CRC(M_{k+1}, v)$ +may be obtained from known $C_k = \CRC(M_k, v)$ and symbols $m_k$ and +$m_{k+N}$ only, without the need to compute CRC of entire message +$M_{k+1}$. This property may be utilized to efficiently compute a set of +rolling Rabin fingerpints. + +Since $M_{k+1}(x) = M_k(x) x^W - m_{k}(x) x^{NW} + m_{k+N}(x)$, + \begin{align*} + & C_{k+1}(x) = \CRC\bigl(M_{k+1}(x), v(x)\bigr) = \\ + &= \left(\bigl(v(x)-u(x)\bigr) x^{NW} + u(x) + \sum_{n=0}^{N-1} m_{k+1+n}(x) x^{D+W(N-1-n)} \right) \bmod P(x) = \\ + &= F\bigl(C_k(x), m_{k+N}(x)\bigr) + G\bigl(m_k(x)\bigr), + \end{align*} +where + \begin{align*} + & F\bigl(C_k(x), m_{k+N}(x)\bigr) = \Bigl(C_k(x) x^W + m_{k+N}(x) x^D\Bigr) \bmod P, \\ + & G\bigl(m_k(x)\bigr) = \Bigl(\bigl(\bigl(v(x)-u(x)\bigr) x^{NW} + u\bigr) (1 - x^W) - m_k(x) x^{D+NW} \Bigr) \bmod P + \end{align*} +are polynomials of degree less than $D$. + +$G\bigl(m_{k-1}(x)\bigr)$ may be computed easily via a single lookup +in a table of $2^W$ entries indexed by $m_k$. + +Computation of $F\bigl(C_k(x), m_{k+N}(x)\bigr)$ may be implemented as +described in section \ref{s:crcbyte} and requires one bitwise shift, one +bitwise XOR, and one lookup into a precomputed table containing $2^W$ +entries. + + +% ----------------------------------------- +\subsection{Reading multiple bytes at a time} \label{s:crcbyteword} + +One straightforward way to speed up byte-by-byte CRC computation is to read +$W > 8$ bits at once. Unfortunately, this is the path of very rapidly +diminishing return as the size of the MulByPowD table increases with $W$ +exponentially. From practical perspective, it is extremely desirable to +ensure that the MulByPowD table fits into the L1 cache (32-64KB), otherwise +table entry access latency sharply increases from 3-4 CPU cycles (L1 cache) +to 15-20 CPU (L2 cache). + +The value of $\mbox{MulByXpowD}\bigl(v(x)\bigr)$ may be computed +iteratively using a smaller table because + \begin{align} + \mbox{MulByXpowD}\bigl(v(x)\bigr) + = v(x) \cdot x^D \bmod P(x) + = \SCRC\bigl(v(x), 0\bigr) \label{e:readwordatonce} + \end{align} +and therefore may be computed using formulas (\ref{e:incremental}) and +(\ref{e:crcbyte}) for smaller values of $W'$. + +\cite{Black93} provided the implementation for $W=32$ and $W'=8$. Our more +general implementation was faster than byte-by-byte CRC but not +substentially: the improvement was in 20-25\% range. However, the result is +still important -- it demonstrates that reading input data per se is not a +bottleneck. + + +% ----------------------------------------- +\subsection{Computing a CRC word by word} \label{s:crcword} + +The value of $\mbox{MulByXpowD}\bigl(v(x)\bigr)$ may be computed using +multiple smaller tables instead of one table. Given that +$\deg\bigl(v(x)\bigr) < W$, $v(x)$ may be represented as a weighted +sum of polynomials $v_k(x)$ such that $\deg\bigl(v_k(x)\bigr) < B$: + \begin{align*} + v(x) = \sum_{k=0}^{K-1} v_k(x) \cdot x^{(K-1-k)B}, + \end{align*} +where $K = \lceil W/B \rceil$ and + \begin{align*} + v_k(x) = \left\lfloor \frac{v(x)}{x^{(K-1-k)B}} \right\rfloor \bmod x^B. + \end{align*} + +Consequently, + \begin{align} + \mbox{MulByXpowD}\bigl(v(x)\bigr) + &= v(x) \cdot x^D \bmod P(x) = \nonumber \\ + &= \left(\sum_{k=0}^{K-1} v_k(x) \cdot x^{(K-1-k)B}\right) \cdot x^D \bmod P(x) = \nonumber \\ + &= \sum_{k=0}^{K-1} \left(v_k(x) \cdot x^{(K-1-k)B+D} \bmod P(x)\right) = \nonumber \\ + &= \sum_{k=0}^{K-1} \mbox{MulWordByXpowD}\bigl(k, v_k(x)\bigr), \label{e:crcword} + \end{align} +where the values of + \begin{align} + \mbox{MulWordByXpowD}\bigl(k, v_k(x))\bigr) = v_k(x) \cdot x^{(K-1-k)B+D} \bmod P(x) \label{e:crcwordtable} + \end{align} +may be obtained using $K$ precomputed tables. Given that +$\deg\bigl(v_k(x)\bigr) < B$, each table should contain $2^B$ +entries. + +A sample implementation of formulas (\ref{e:crcdefinition}), +(\ref{e:incremental}), (\ref{e:crcword}), and (\ref{e:crcwordtable}) is +given in listing \ref{l:CrcWord} using $B=8$ and assuming that $W$ is a +multiple of 8. + +\begin{figure} +\begin{lstlisting}[caption={Computing CRC word by word},label={l:CrcWord}] +Crc CrcWord(Word value) { + Crc result = 0; + // Unroll this loop or let compiler do it. + for (int byte = 0; byte < sizeof(Word) / 8; ++byte) { + result ^= MulWordByXpowD[byte][(Byte) value]; + value >>= 8; + } + return result; +} +Crc CrcWordByWord(Word *data, int n, Crc v, Crc u) + Crc crc = v ^ u; + for (int i = 0; i < n; ++i) { + Crc WordCrc = CrcWord(crc ^ data[i]); + if (sizeof(Crc) <= sizeof(Word)) { + crc = WordCrc; + } else { + crc >>= 8; + crc ^= WordCrc; + } + } + return (crc ^ u); +} +void InitWordTables() { + for (int byte = 0; byte < sizeof(Word) / 8; ++byte) { + // (K-1-k)*B + D = (W/8-1-byte)*8 + D = D - 8 + W - 8*byte. + Crc m = XpowN(D - 8 + sizeof(Word)*8 - 8*byte); + for (int i = 0; i < 256; ++i) { + MulWordByXpowD[byte][i] =MultiplyUnnormalized(i, 8, m); + } + } +} +\end{lstlisting} +\end{figure} + +CrcWordByWord\footnote{The variant presented in this paper is more general +than ``slicing" described in \cite{Kounavis2005\remove{, +DBLP:conf/iscc/KounavisB05, DBLP:journals/tc/KounavisB08}}. Sample +implementation given in listing \ref{l:CrcWord} does not include one subtle +optimization implemented in \cite{Kounavis2005\remove{, +DBLP:conf/iscc/KounavisB05, DBLP:journals/tc/KounavisB08}} as it was found +to be counter-productive.} with $W=64$ uses only 2.1-2.2 CPU cycles/byte on +modern 64-bit CPUs (our implementation is somewhat faster than the one +described in \cite{Kounavis2005\remove{, DBLP:conf/iscc/KounavisB05, +DBLP:journals/tc/KounavisB08}}). It solves the problem with data access +and, to lesser degree, allows instruction level parallelism: in the middle +of the unrolled main loop of CrcOfWord function the CPU may process +multiple bytes in parallel. + +However, this solution is still imperfect -- the beginning of computation +contends for a single source of data (variable $value$), and the end of +computation contends for a single destination (variable $result$). Further +improvement requires processing of multiple independent data streams in +interleaved manner so that when computation of one data flow path is +stalled the CPU may proceed with another one. + +% ----------------------------------------- +\subsection{Processing non-overlapping blocks in parallel} \label{s:blockword} + +Straighforward pipepiling may be achieved by spliting the input message +$M(x)=M_0(x) \ldots M_{N-1}(x)$ into $N$ blocks $M_k(x)$ of approximately +the same size and computing CRC of each block in an interleaved manner, +concatenating CRCs of individual blocks in the end. A sample implementation +is given in listing \ref{l:CrcWordBlock}. + +\begin{figure} +\begin{lstlisting}[caption={Processing non-overlapping blocks in parallel},label={l:CrcWordBlock}] +// Processes N stripes of StripeWidth words each +// word by word, in an interleaved manner. +Crc CrcWordByWordBlocks(Word *data, Crc v, Crc u) { + assert(n % (N * StripeWidth) == 0); + // Use N local variables instead of the array. + Crc crc[N]; + // Initialize the CRC value for each stripe. + crc[0] = v ^ u; + for (int stripe = 1; stripe < N; ++stripe) + crc[i] = 0 ^ u; + // Compute each stripe's CRC. + for (int i = 0; i < StripeWidth; ++i) { + // Compute multiple CRCs in interleaved manner. + Word buf[N]; + for (int stripe = 0; stripe < N; ++stripe) { + buf[i] = + crc[stripe] ^ data[i + stripe * StripeWidth]; + if (D > sizeof(Word) * 8) { + crc[stripe] >>= D - sizeof(Word) * 8; + } else { + crc[stripe] = 0; + } + } + for (int byte = 0; byte < sizeof(Word) / 8; ++byte) { + for (int stripe = 0; stripe < N; ++stripe) { + crc[stripe] ^= + MulWordByXpowD[byte][(Byte) buf[stripe]]; + buf[stripe] >>= 8; + } + } + } + // Combine stripe CRCs. + for (int stripe = 1; stripe < N; ++stripe) { + crc[0] = ChangeStartingValue( + crc[stripe], StripeWidth, 0, crc[0]); + } + return (crc[0] ^ u); +} +\end{lstlisting} +\end{figure} + +A tuned implementation of $CrcWordByWordBlocks$ is capable of processing +data at 1.3-1.4 CPU cycles/byte on sufficiently large (64KB and more) +inputs, which is noticeably better that 2.1-2.2 CPU cycles/byte delivered +by word by word CRC computation. It is a good sign that it is a move in +right direction. + +The drawbacks of this approach are obvious: it does not work well with +small inputs -- the cost of CRC concatentation becomes a bottleneck, -- and +it may be susceptible to false cache collisions caused by cache line +aliasing. + +If the cost of CRC concatenation was not a problem, cache pressure could be +mitigated with the use of very narrow stripes. The code in question, lines +33-37 of listing \ref{l:CrcWordBlock} which combine CRCs of individual +stripes, iteratively computes + \begin{align*} + \mbox{crc}_0(x) = \mbox{crc}_k(x) + \Bigl(\mbox{crc}_0 \cdot x^{8S} \bmod P(x)\Bigr) + \end{align*} +for $k = 1, \ldots, N-1$ where $N$ and $S$ are the number and the width of +the stripes respectively. It may be rearranged as + \begin{align*} + \mbox{crc}_0(x) = \sum_{k = 0}^{N-1} \Bigl(\mbox{crc}_{K-1-k} \cdot x^{8kS} \bmod P(x)\Bigr). + \end{align*} + +Explicit multiplication by $x^{8kS}$ may be avoided by moving it into preset +tables + \begin{align*} + \mbox{MulWordByXPowD}_k(n) = \mbox{MulWordByXPowD}(n) \cdot x^{kS} \bmod P(x). + \end{align*} +that are used to compute $crc'_k(x) = \mbox{crc}_k(x) \cdot x^{8kS}$, so that + \begin{align*} + \mbox{crc}_0(x) = \sum_{k = 0}^{N-1} crc'_k. + \end{align*} + +Unfortunately, this approach alone does not help because +\begin{enumerate} +\item + It increases the memory footprint of MulWordByXPowD by factor of $N$. + Once the cumulative size of $\mbox{MulWordByXPowD}_k$ tables exceeds the + size of L1 cache (32-64KB), the cost of memory access to multiplication + table data increases from 3-4 CPU cycles to 15-20, eliminating all + performance gains achieved by reducing the number of table operations. +\item + It is still necessary to combine all $N$ values of $\mbox{crc}_k$ into + $\mbox{crc}_0$ at the end of the CRC computation. +\end{enumerate} + + +% ----------------------------------------- +\subsection{Interleaved word-by-word CRC} \label{s:multiword} + +% ----------------------------------------- +\subsubsection{Parallelizing CRC computation} \label{s:parallelizing} + +Assume that input message $M$ is the concatenation of $K$ groups $g_k$, and +each group $g_k$ is concatenation of $N$ $W$-bit long words: + \begin{align*} + M(x) &= \sum_{k=0}^{K-1} g_k(x) \cdot x^{(K-1-k)NW}, \\ + g_k(x) &= \sum_{n=0}^{N-1} m_{k, n} \cdot x^{(N-1-n)W}. + \end{align*} + +Input message $M(x)$ may be represented as + \begin{align} + M(x) + &= \sum_{k=0}^{K-1} g_k(x) \cdot x^{(K-1-k)NW} = \nonumber \\ + &= \sum_{k=0}^{K-1} \left(\sum_{n=0}^{N-1} m_{k, n} \cdot x^{(N-1-n)W} \right) \cdot x^{(K-1-k)NW} = \nonumber \\ + &= \sum_{n=0}^{N-1} \left(\sum_{k=0}^{K-1} m_{k, n} \cdot x^{(K-1-k)NW}\right) \cdot x^{(N-1-n)W} = \nonumber \\ + &= \sum_{n=0}^{N-1} M_n(x) \cdot x^{(N-1-n)W} \label{e:splitbyword} + \end{align} +where + \begin{align*} + M_n(x) + &= \sum_{k=0}^{K-1} m_{k, n} \cdot x^{(K-1-k)NW}. + \end{align*} + +In other words, $M_n$ is concatenation of $n$-th $W$-bit word from $g_0$ +followed by $(N-1)W$ zero bits, then $n$-th word from $g_1$ followed by +$(N-1)W$ zero bits, etc., ending up with $n$-th word from last group +$g_{K-1}$. + +Appending $(N-1)W$ zero bits to $M_n$ yields $M'_n(x) = M_n(x) \cdot +x^{(N-1)W} $ which may be viewed as the concatenation of $K$ $NW$-bit +groups $f_{k}$: + \begin{align*} + M'_n(x) + &= M_n(x) \cdot x^{(N-1)W} + = \sum_{k=0}^{K-1} f_{k, n} \cdot x^{(K-1-k)NW}, \\ + f_{k, n}(x) &= m_{k, n}(x) \cdot x^{(N-1)W}, \\ + \end{align*} +so + \begin{align} + M(x) + &= \sum_{n=0}^{N-1} M_n(x) \cdot x^{(N-1-n)W} \nonumber \\ + &= \sum_{n=0}^{N-1} M'_n(x) \cdot x^{-(N-1)W} \cdot x^{(N-1-n)W} \nonumber \\ + &= \sum_{n=0}^{N-1} M'_n(x) \cdot x^{-nW}. \label{e:mdash} + \end{align} + +According to (\ref{e:incremental}), + $v_{K, n}(x) = \SCRC\bigl(M'_n(x), v_{0, n}(x)\bigr)$ +may be computed incrementally: + \begin{align} + v_{k+1, n}(x) + &= \SCRC\bigl(f_{k, n}(x), v_{k, n}(x)\bigr) = \nonumber \\ + &= \SCRC\bigl(m_{k, n}(x) \cdot x^{(N-1)W}, v_{k, n}(x)\bigr) = \nonumber \\ + &= \Bigl(v_{k, n}(x) \cdot x^{NW} + m_{k, n}(x) \cdot x^{(N-1)W} \cdot x^D \Bigr) \bmod P(x) = \nonumber \\ + &= \Bigl(v_{k, n}(x) \cdot x^W + m_{k, n}(x) \cdot x^D \Bigr) \cdot x^{(N-1)W} \bmod P(x) = \label{e:crcwordnmultiply} \\ + &= \mbox{CrcWordN}\bigl(m_{k, n}(x), v_{k, n}(x)\bigr). \label{e:crcwordn} + \end{align} + +This approach: +\begin{enumerate} +\item + Creates $N$ independent data flows: computation of $v_{k, 0}, \ldots, + v_{k, N-1}$ may be performed truly in parallel. There are no contentions + on a single data source or destination like those the word-by-word CRC + computation described in section \ref{s:crcword} suffered from. +\item + Input data is accessed sequentially. Therefore, the load on cache + subsystem and false cache collisions are minimal. Thus, the performance + bottlenecks of approach described in \ref{s:blockword} are eliminated. +\end{enumerate} + + +% ----------------------------------------- +\subsubsection{Combining individual CRCs} \label{s:combine} + +Once $v_{K, n}(x) = \SCRC\bigl(M'_n(x), v_{0, n}(x)\bigr)$ are computed starting with + \begin{align*} + v_{0, 0} &= v(x), \\ + v_{0, n} &= 0, n \geq 1, + \end{align*} +by definition (\ref{e:simplifiedcrc}) of $\SCRC$ and relationship (\ref{e:mdash}), + \begin{align} + \SCRC\bigl(M(x), v(x)\bigr) + &= \SCRC\left(\sum_{n=0}^{N-1} M'_n(x) \cdot x^{-nW}, v(x)\right) = \nonumber \\ + &= \sum_{n=0}^{N-1} \SCRC\bigl(M'_n(x) \cdot x^{-nW}, v_{0, n}(x) \bigr) = \nonumber \\ + &= \sum_{n=0}^{N-1} \SCRC\bigl(M'_n(x), v_{0, n}(x) \bigr) \cdot x^{-nW} = \nonumber \\ + &= \sum_{n=0}^{N-1} v_{K, n}(x) \cdot x^{-nW}. \label{e:multiwordcrc1} + \end{align} + +Even though this step is performed only once per input message, it still +requires $(N-1)$ non-trivial multiplications modulo $P(x)$ negatively +affecting the performance on small input messages. Also, +(\ref{e:multiwordcrc1}) uses the multiplicative inverse of $x^{nW}$ modulo +$P(x)$ which does not exists when $P(x) \bmod x = 0$. + +There is more efficient and elegant solution. Assume that $M(x)$ is +followed by one more group $g_K(x)$. Then + \begin{align} + & \SCRC\bigl(M(x) \cdot x^{NW} + g_K(x), v(x)\bigr) = \nonumber \\ + & = \SCRC\Bigl(g_K(x), \SCRC\bigl(M(x), v(x)\bigr)\Bigr) = \nonumber \\ + & = \Bigl(\SCRC\bigl(M(x), v(x)\bigr) \cdot x^{NW} + g_K(x) \cdot x^D \Bigr) \bmod P(x) = \nonumber \\ + & = \left(x^{NW} \sum_{n=0}^{N-1} v_{K, n}(x) \cdot x^{-nW} + x^D \sum_{n=0}^{N-1} m_{K, n}(x) \cdot x^{(N-1-n)W} \right) \bmod P(x) = \nonumber \\ + & = \left(x^{W} \sum_{n=0}^{N-1} v_{K, n}(x) \cdot x^{(N-1-n)W} + x^D \sum_{n=0}^{N-1} m_{K, n}(x) \cdot x^{(N-1-n)W} \right) \bmod P(x) \nonumber \\ + & = \sum_{n=0}^{N-1} \Bigl( v_{K, n}(x) \cdot x^{W} + m_{K, n}(x) \cdot x^D\Bigr) \cdot x^{(N-1-n)W} \bmod P(x) = \label{e:additionalmultiply} \\ + & = \sum_{n=0}^{N-1} \SCRC\bigl(m_{K, n}(x), v_{K, n}(x)\bigr) \cdot x^{(N-1-n)W} \bmod P(x). \label{e:additionalmultiply2} + \end{align} + +(\ref{e:additionalmultiply2}) may be implemented using formula +(\ref{e:crcwordtable}) by setting $v'_0 = 0$, and then for $n = 0, \ldots, +N-1$ computing + \begin{align*} + v'_{n+1}(x) + &= \Bigl(\bigl(v'_n(x) + v_{K, n}\bigr) \cdot x^W + m_{K, n} \cdot x^D\Bigr) \bmod P(x) \\ + &= \SCRC\bigl(m_{K,n}, v'_n(x) + v_{K, n} \bigr). + \end{align*} + +Alternatively, this step may be performed using the less efficient +technique described in section \ref{s:crcbyteword}. + + +% ----------------------------------------- +\subsubsection{Efficient computation of individual CRCs} \label{s:compute} + +Given $v(x)$, $\deg\bigl(v(x)\bigr) < D$ and $m(x)$, $\deg\bigl(m(x)\bigr) < W$, +\begin{align*} + \mbox{CrcWordN}\bigl(m(x), v(x)\bigr) + &= \Bigl(v(x) \cdot x^W + m(x) \cdot x^D \Bigr) \cdot x^{(N-1)W} \bmod P(x) +\end{align*} +may be implemented efficiently utilizing the techniques described in +sections \ref{s:crcbyte}, \ref{s:crcbyteword}, and \ref{s:crcword}. When $D +\leq W$, + \begin{align*} + \mbox{CrcWordN}\bigl(m(x), v(x)\bigr) + &= \Bigl(v(x) \cdot x^W + m(x) \cdot x^D \Bigr) \cdot x^{(N-1)W} \bmod P(x) = \\ + &= \Bigl(v(x) \cdot x^{W-D} + m(x) \Bigr) \cdot x^{(N-1)W + D} \bmod P(x), + \end{align*} +and may be implemented using the table-driven multiplication as described +in (\ref{e:crcwordtable}) except that the operand is multiplied by +$x^{(N-1)W+D}$ instead of $x^D$. Like in (\ref{e:crcbytetable2}), explicit +multiplication of $v(x)$ by $x^{W-D}$ is not required since $D$-normalized +representation of $v(x)$, viewed as a $W$-normalized representation, is +equal to $\left(v(x) \cdot x^{W-D}\right)$. + +Using the same technique as in formula (\ref{e:crcbyte}), for $D \geq W$ +let + \begin{align*} + v_H(x) &= \left\lfloor\frac{v(x)}{x^{D-W}}\right\rfloor, + & \deg\bigl(v_H(x)\bigr) &< W, \\ + v_L(x) &= v(x) \bmod x^{D-W}, + & \deg\bigl(v_L(x)\bigr) &< D-W, + \end{align*} +so that $v(x) = v_L(x) + v_H(x) \cdot x^{D-W}$. Then, + \begin{align} + & \mbox{CrcWordN}\bigl(m(x), v(x)\bigr) = \nonumber \\ + & = \Bigl(v(x) \cdot x^W + m(x) \cdot x^D \Bigr) \cdot x^{(N-1)W} \bmod P(x) = \nonumber \\ + & = \Bigl(\bigl(v_L(x) + v_H(x) \cdot x^{D-W}\bigr) \cdot x^W + m(x) \cdot x^D \Bigr) \cdot x^{(N-1)W} \bmod P(x) = \nonumber \\ + & = \Bigl(v_L(x) \cdot x^W + \bigl(v_H(x) + m(x)\bigr) \cdot x^D \Bigr) \cdot x^{(N-1)W} \bmod P(x) = \nonumber \\ + & = \Bigl(\bigl(v_H(x) + m(x)\bigr) \cdot x^{(N-1)W + D} \bmod P(x)\Bigr) + \nonumber \\ + & + \Bigl(\bigl(v_L(x) \cdot x^W \bigr) \cdot x^{(N-1)W} \bmod P(x)\Bigr). \label{e:crcwordinterleaved} + \end{align} + +Since $\deg\bigl(v_H(x)+m(x)\bigr) < W$, the first summand of + $\mbox{CrcWordN}\bigl(m(x), v(x)\bigr)$, +\begin{align*} + \Bigl(\bigl(v_H(x) + m(x)\bigr) \cdot x^{(N-1)W + D} \bmod P(x)\Bigr), +\end{align*} +may be computed using the table-driven multiplication technique described +in (\ref{e:crcwordtable}) except that the operand is multiplied by +$x^{D+(N-1)W}$ instead of $x^D$. + +Computation of the second summand of $\mbox{CrcWordN}\bigl(m(x), v(x)\bigr)$, + \begin{align*} + \Bigl(\bigl(v_L(x) \cdot x^W \bigr) \cdot x^{(N-1)W} \bmod P(x)\Bigr), + \end{align*} +is somewhat less intuitive. Since $\deg\bigl(v_L(x)\bigr) < D-W$, + \begin{align*} + \left(v_L(x) \cdot x^W\right) \bmod P(x) = \left(v_L(x) \cdot x^W\right), + \end{align*} +and may be computed by shifting $v_L(x)$ by $W$ bits. Additional +multiplication by $x^{(N-1)W}$ is accomplished by adding $\bigl(v_L(x) +\cdot x^W\bigr)$, produced at step $n < N-1$ of the algorithm described by +formula (\ref{e:crcwordn}), to the value of $v_{k, n+1}(x)$ which will be +additionally multiplied by $x^{(N-1)W}$ as shown in formula +(\ref{e:crcwordnmultiply}). + +For $n=N-1$, the value of $\bigl(v_L(x) \cdot x^W\bigr)$ should be added to +the value of $v_{k+1, n'}(x)$ where $n' = 0$. For $k < K$, it will be +multiplied by $x^{(N-1)W}$ during next round of parallel computation as +shown in (\ref{e:crcwordnmultiply}). For $k = K$, $v_{k+1, n'}(x)$ will be +multiplied by $x^{(N-1)W}$ during CRC concatenation as shown in +(\ref{e:additionalmultiply}) since $n'=0$. + +\begin{figure} +\begin{lstlisting}[caption={Interleaved, word by word CRC computation},label={l:CrcMultiword}] +Crc CrcInterleavedWordByWord( + Word *data, int blocks, Crc v, Crc u) { + Crc crc[N+1] = {0}; + crc[0] = v ^ u; + for (int i = 0; i < N*(blocks - 1); i += N) { + Word buffer[N]; + // Load next N words and move overflow + // bits into "next" word. + for (int n = 0; n < N; ++n) { + buffer[N] = crc[n] ^ data[i + n]; + if (D > sizeof(Word) * 8) + crc[n+1] ^= crc[n] >> (sizeof(Word) * 8); + crc[n] = 0; + } + // Compute interleaved word-by-word CRC. + for (int byte = 0; byte < sizeof(Word); ++byte) { + for (int n = 0; n < N; ++n) { + crc[n] ^= + MulInterleavedWordByXpowD[byte][(Byte) buffer[n]]; + buffer[n] >>= 8; + } + } + // Combine crc[0] with delayed overflow bits. + crc[0] ^= crc[N]; + crc[N] = 0; + } + // Process the last N bytes and combine CRCs. + for (int n = 0; n < N; ++n) { + if (n != 0) crc[0] ^= crc[n]; + Crc WordCrc = CrcOfWord(crc[0] ^ data[i + n]); + if (D > sizeof(Word) * 8) { + crc[0] >>= D - sizeof(Word) * 8; + crc[0] ^= WordCrc; + } else { + crc[0] = WordCrc; + } + } + return (crc[0] ^ u); +} +void InitInterleavedWordTables(void) { + for (int byte = 0; byte < sizeof(Word); ++byte) { + Crc m = XpowN(D - 8 + N*sizeof(Word)*8 - 8*byte); + for (int i = 0; i < 256; ++i) { + MulInterleavedWordByXpowD[byte][i] = + MultiplyUnnormalized(i, 8, m); + } + } +} +\end{lstlisting} +\end{figure} + + +% ----------------------------------------- +\section{Experimental results} + +The tests were performed using Intel Q9650 3.0GHz CPU, DDR2-800 memory with +4-4-4-12 timing, and a motherboard with an Intel P45 chipset. + + +% ----------------------------------------- +\subsection{Testing methology} + +All tests were performed using random input data over various block sizes. +The code for all evaluated algorithms was heavily optimized. Tests were +performed on both aligned and non-aligned input data to ensure that +misaligned inputs do not carry performance penalty. CRC tables were aligned +on 256-byte boundary. + +Tests were performed with warm data and warm CRC tables: as shown in +\cite{Kounavis2005\remove{, DBLP:conf/iscc/KounavisB05, +DBLP:journals/tc/KounavisB08}}, the footprint of CRC tables -- as long as +they fit into L1 cache -- is not a major contributor to the performance. + +Performance was measured in number of CPU cycles per byte of input data: +apparently, performance of CRC computation is bounded by performance of CPU +and its L1 cache latency. Spot testing of few other Intel and AMD CPU +models showed little variation in performance measured in CPU cycles per +byte despite substential differences in CPU clock frequencies. + +To minimize performance variations caused by interference with OS and other +applications (context switches, CPU migrations, CPU cache flushes, memory +bus interference from other processes, etc.), the test applications were +run at high priority, each test was executed multiple times, and the +minimum time was measured. That allowed the tests to achieve repeatability +within $\pm 1\%$. + + +% ----------------------------------------- +\subsection{Compiler comparison} + +Despite CRC code being rather straightforward, there were surprises (see +tables \ref{t:CompilerComparison128} and \ref{t:CompilerComparison64}). + +On 64-bit AMD64 platform, Microsoft CL compiler (version 15.00.30729) +consistently and noticeably generated the fastest code using +general-purpose integer arithmetics (64-bit and smaller CRCs) -- 1.23 times +faster than the code generated by Intel's ICL 11.10.051 and 1.49 times +faster than the code generated by GCC 4.5.0. A tuned, hand-written inline +assembler code for CRC-32 and CRC-64 for GCC was as fast as the code +generated by CL. + +When it comes to arithmetics with the use of SSE2 intrinsic functions on +64-bit AMD64 platform for 128-bit CRC, the code generated by GCC 4.5.0 +consistenly outperformed the code generated by Microsoft and Intel +compilers -- by a factor of 1.21 and 1.33 respectively. However, earlier +versions of GCC did not produce efficient SSE2 code either. For that +reason, pre-4.5.0 versions of GCC use hand-written inline assember code +which was as fast as the code generated by GCC 4.5.0. + +Neither compiler was able to generate efficient code on 32-bit bit I386 +platform. Performance of the code that used MMX intrinsic functions was +better but still not as good as hand-written assember, which was provided +for all compilers. + +The fastest code for 128-bit CRC on I386 platform was generated by GCC +4.5.0. + + +% ----------------------------------------- +\subsection{Choice of interleave level} + +Number of data streams processed by interleaved, word-by-word CRC +computation described in section \ref{s:multiword} should matter. Too few +means underutilization of available ALUs. Too many will increase the length +of the main loop and stress instruction decoders, and may cause splilling +of registers containing hot data (interleaved processing of $N$ words of +data uses at least $(2N+2)$ registers). + +As table \ref{t:MultiwordPerfByStripe} shows, the optimal number of +interleaved data streams on modern Intel and AMD CPUs for integer +arithmetics is either 3 or 4 (likely because they all have exactly 3 ALUs). +However, for SSE2 arithmetics on AMD64 platform the optimal number of +streams is 6 (3 on I386), which is quite counter-intuitive result as it does +not correlate with the number of available ALUs. Good old performance +mantra "you need to measure" still applies. + + +% ----------------------------------------- +\subsection{Performance of CRC algorithms} + +Average performance of best variants of CRC algorithms for 64-bit AMD64 and +32-bit I386 platforms processing 1KB, 2KB, \ldots, 1MB inputs is given in +tables \ref{t:AveragePerformance64} and \ref{t:AveragePerformance64} +respectively. Proposed interleaved multiword CRC algorithm is 1.7-2.0 times +faster that current state of the art ``slicing''. + +As demonstrated in tables \ref{t:CRC64Perf} and \ref{t:CRC32Perf}, +interleaved word-by-word CRC described in section \ref{s:multiword}, +running at 1.2 CPU cycles/byte, is 1.8 times faster than 2.1 CPU +cycles/byte achieved by current state of the art word-by-word CRC algorithm +(``slicing") described in \cite{Kounavis2005\remove{, +DBLP:conf/iscc/KounavisB05, DBLP:journals/tc/KounavisB08}}. + +On 64-bit AMD64 platform, the best performance was achieved using 64-bit +reads and 64-bit tables for all variants of $N$-bit CRC for $N \leq 64$. In +particular, tables \ref{t:CRC64Perf} and \ref{t:CRC32Perf} clearly show +that performance of 32-bit and 64-bit CRCs is nearly identical. +Consequently, there is no reason to favor CRC-32 over CRC-64 for +performance reasons. + +The use of MMX on the 32-bit I386 platform allowed to utilize 64-bit tables +and 64-bit reads achieving 1.3 CPU cyles/byte. Neither compiler generated +efficient code using MMX intrinsic functions, so inline assembler was used. + +With the use of SSE2 intrinsics on AMD64 architecture, 128-bit CRC may be +computed takes at 1.7 CPU cycles/byte using the new algorithm (see +table \ref{t:CRC128PerfMultiword}), compared with 2.9 CPU cycles/byte +achieved by word-by-word CRC computation (see table +\ref{t:CRC128PerfSlicing}). On the 32-bit I386 architecture, the use of SSE2 +intrinsics and GCC 4.5.0 allowed the computation of 128-bit CRC at 2.1 CPU +cycles/byte, compared with 4.2 CPU cycles/byte delivered by +word-by-word algorithm. + +Given that MD5 computation takes 6.8-7.1 CPU cycles/byte and SHA-1 takes +7.6-7.9 CPU cycles per byte, CRCs are still the algorithm of choice for +data corruption detection. + + + +% ----------------------------------------- +\bibliographystyle{alpha} +\bibliography{crc} + +% ----------------------------------------- +\appendix +\cleardoublepage + + + +% ----------------------------------------- +\begin{table} +\begin{center} + +\caption{CRC performance, AMD64 platform} \label{t:AveragePerformance64} +\begin{tabular}{| l | c | c | c |} + \hline +Method & Slicing$^1$ & Multiword$^2$ & Improvement \\ + \hline + CRC-32 & $2.08^3$ & $1.16^{4,5}$ & 1.79 \\ + CRC-64 & $2.09^3$ & $1.16^{4,5}$ & 1.79 \\ + CRC-128 & $2.91^4$ & $1.68^{4,6}$ & 1.73 \\ + \hline +\end{tabular} +{} + +\caption{CRC performance, I386 platform} \label{t:AveragePerformance32} +\begin{tabular}{| l | c | c | c |} + \hline +Method & Slicing$^1$ & Multiword$^2$ & Improvement \\ + \hline + CRC-32 & $2.52^3$ & $1.29^{3,7}$ & 1.96 \\ + CRC-64 & $3.28^3$ & $1.29^{3,7}$ & 2.55 \\ + CRC-128 & $4.17^4$ & $2.10^{4,8}$ & 1.98 \\ + \hline +\end{tabular} +{} +\end{center} + + + +The best average number of CPU cycles per byte processing 1KB-1MB inputs. +Warm data, warm tables. + +$^1$ {\it``Slicing"} implements the algorithm described in section +\ref{s:crcword}. + +$^2$ {\it``Multiword/$N$"} implements algorithm described in section +\ref{s:multiword} processing $N$ data streams in parallel in interleaved +manner. + +$^3$ Microsoft CL 15.00.30729 compiler, ``-O2" flag. + +$^4$ GCC 4.5.0 compiler, ``-O3" flag. + +$^5$ Multiword/$N=4$, hand-written inline assembler. + +$^6$ Multiword/$N=6$, C++. + +$^7$ Multiword/$N=4$, hand-written MMX inline assember. + +$^8$ Multiword/$N=3$, C++. + +\end{table} + + + +% -------------------------------------- +\begin{table} +\begin{center} +\caption{Interleaved multiword CRC: choosing the number of stripes $N$} + +\label{t:MultiwordPerfByStripe} +\begin{tabular}{| l | l | c | c | c | c | c | c | c |} + \hline + CRC & Platform & N=2 & N=3 & N=4 & N=5 & N=6 & N=7 & N=8 \\ + \hline + CRC-64$^9$ & AMD64 & 1.42 & 1.23 & {\bf 1.17} & 1.46 & 2.08 & 2.59 & 2.73 \\ + CRC-128$^{10}$ & AMD64 & 2.07 & 1.84 & 1.76 & 1.70 & {\bf 1.68} & 1.75 & 1.79 \\ + CRC-128$^{10}$ & I386 & 2.56 & {\bf 2.10} & 2.46 & 2.61 & 2.52 & 2.62 & 2.57 \\ + \hline +\end{tabular} +\end{center} +{} + +Average number of CPU cycles per byte processing 1KB, 2KB, \ldots, 1MB +inputs. Interleaved word-by-word CRC computation as described in section +\ref{s:multiword}. Warm data, warm tables. + +$^9$ Microsoft CL 15.00.30729 compiler, AMD64 platform, C++ code. + +$^{10}$ GCC 4.5.0 compiler, AMD64 platform, C++ code. + +\end{table} + + + +% ----------------------------------------- +\begin{table} +\begin{center} + +\caption{Compiler comparison: Multiword/N, 64-bit CRC} \label{t:CompilerComparison64} +\begin{tabular}{| l | c | c | c | c | c | c | c | c | c |} + \hline +Input size & N & 64 & 256 & 1K & 4K & 16K & 64K & 256K & 1M \\ + \hline + GCC/C++ & 3 & 2.11 & 1.84 & 1.76 & 1.74 & 1.75 & 1.75 & 1.75 & 1.76 \\ + ICL & 3 & 2.35 & 1.65 & 1.48 & 1.44 & 1.44 & 1.45 & 1.45 & 1.45 \\ + CL & 4 & 1.75 & 1.29 & 1.18 & 1.15 & 1.17 & 1.18 & 1.18 & 1.18 \\ + GCC/ASM & 4 & 1.65 & 1.26 & 1.17 & 1.15 & 1.16 & 1.17 & 1.17 & 1.17 \\ + \hline +\end{tabular} +{} + +\caption{Compiler comparison: Multiword/N, 128-bit CRC} \label{t:CompilerComparison128} +\begin{tabular}{| l | c | c | c | c | c | c | c | c | c |} + \hline +Input size & N & 64 & 256 & 1K & 4K & 16K & 64K & 256K & 1M \\ + \hline + CL & 5 & 4.08 & 2.56 & 2.43 & 2.25 & 2.20 & 2.19 & 2.18 & 2.20 \\ + ICL & 5 & 3.52 & 2.33 & 2.23 & 2.05 & 2.00 & 1.99 & 1.99 & 2.01 \\ + GCC & 6 & 2.90 & 1.93 & 1.85 & 1.72 & 1.65 & 1.63 & 1.63 & 1.63 \\ + \hline +\end{tabular} +{} +\end{center} + +Number of CPU cycles per byte, best code for given compiler and CRC. + +64-bit CRC (CRC-64-ECMA-182 polynomial) and 128-bit CRC (CRC-128/IEEE +polynomial) respectively. 64-bit platform, 64-bit reads. Warm data, warm +tables. + +Microsoft CL 15.00.30729 compiler was used with ``-O2" flag. Intel ICL +11.10.051 and GCC 4.5.0 were used with ``-O3" flag. + +\begin{center} +\includegraphics[trim=14.25mm 50mm 16.75mm 50mm, width=0.99\textwidth]{CompilerComparison.pdf} \label{f:CompilerComparison} +\end{center} + +{\it``Multiword/$N$"} implements algorithm described in section +\ref{s:multiword} processing $N$ data streams in parallel in interleaved +manner. + + +\end{table} + + +% -------------------------------------- +\begin{table} +\begin{center} + +\caption{CRC-32 performance} \label{t:CRC32Perf} +\begin{tabular}{| l | c | c | c | c | c | c | c | c |} + \hline +Input size & 64 & 256 & 1K & 4K & 16K & 64K & 256K & 1M \\ + \hline + Sarwate & 6.61 & 6.62 & 6.70 & 6.68 & 6.67 & 6.66 & 6.67 & 6.75 \\ + Black & 5.44 & 5.46 & 5.47 & 5.48 & 5.47 & 5.46 & 5.47 & 5.53 \\ + Slicing & 2.15 & 2.10 & 2.09 & 2.09 & 2.08 & 2.08 & 2.08 & 2.10 \\ + Blockword/3 & 2.27 & 2.14 & 2.15 & 2.13 & 2.13 & 1.55 & 1.39 & 1.31 \\ + Multiword/4 & 1.75 & 1.29 & 1.18 & 1.16 & 1.17 & 1.18 & 1.18 & 1.18 \\ + \hline +\end{tabular} +\end{center} + +Number of CPU cycles per byte. 32-bit CRC (CRC-32C polynomial), 64-bit +platform, 64-bit tables, 64-bit reads (except Sarwate). Microsoft CL +15.00.30729 compiler. Warm data, warm tables. + +\begin{center} +\includegraphics[trim=14.25mm 50mm 16.75mm 50mm, width=0.99\textwidth]{CRC32-full.pdf} \label{f:CRC32Perf} +\end{center} + +{\it``Sarwate"} implements the algorithm described in section +\ref{s:crcbyte}. + +{\it``Black"} implements the algorithm described in section +\ref{s:crcbyteword}. + +{\it``Slicing"} implements the algorithm described in section +\ref{s:crcword}. + +{\it``Blockword/3"} implements the algorithm described in section +\ref{s:blockword} with 3 stripes of 15,376 bytes each. + +{\it``Multiword/4"} implements the algorithm described in section +\ref{s:multiword} processing 4 data streams in parallel in interleaved +manner. + + +\end{table} + + +% -------------------------------------- +\begin{table} +\begin{center} + +\caption{CRC-64 performance} \label{t:CRC64Perf} +\begin{tabular}{| l | c | c | c | c | c | c | c | c |} + \hline +Input size & 64 & 256 & 1K & 4K & 16K & 64K & 256K & 1M \\ + \hline + Sarwate & 6.61 & 6.62 & 6.70 & 6.68 & 6.67 & 6.65 & 6.66 & 6.75 \\ + Black & 5.44 & 5.46 & 5.47 & 5.47 & 5.47 & 5.47 & 5.47 & 5.53 \\ + Slicing & 2.16 & 2.08 & 2.09 & 2.10 & 2.08 & 2.08 & 2.08 & 2.09 \\ + Blockword/3 & 2.27 & 2.14 & 2.15 & 2.13 & 2.13 & 1.59 & 1.41 & 1.33 \\ + Multiword/4 & 1.75 & 1.29 & 1.18 & 1.15 & 1.17 & 1.18 & 1.18 & 1.18 \\ + \hline +\end{tabular} +\end{center} + +Number of CPU cycles per byte. 64-bit CRC (CRC-64-ECMA-182 polynomial), +64-bit platform, 64-bit tables, 64-bit reads (except Sarwate). Microsoft CL +15.00.30729 compiler. Warm data, warm tables. + +\begin{center} +\includegraphics[trim=14.25mm 50mm 16.75mm 50mm, width=0.99\textwidth]{CRC64-small.pdf} \label{f:CRC64Perf} +\end{center} + +{\it``Sarwate"} implements the algorithm described in section +\ref{s:crcbyte}. + +{\it``Black"} implements the algorithm described in section +\ref{s:crcbyteword}. + +{\it``Slicing"} implements the algorithm described in section +\ref{s:crcword}. + +{\it``Blockword/3"} implements the algorithm described in section +\ref{s:blockword} with 3 stripes of 15,376 bytes each. + +{\it``Multiword/4"} implements the algorithm described in section +\ref{s:multiword} processing 4 data streams in parallel in interleaved +manner. + + +\end{table} + +% -------------------------------------- +\begin{table} +\begin{center} + + +\caption{CRC-128 performance: Slicing CRC} \label{t:CRC128PerfSlicing} +\begin{tabular}{| l | c | c | c | c | c | c | c | c |} + \hline +Input size & 64 & 256 & 1K & 4K & 16K & 64K & 256K & 1M \\ + \hline + CL/SSE2 & 4.02 & 3.81 & 4.01 & 4.05 & 4.13 & 4.18 & 4.20 & 4.24 \\ + ICL/SSE2 & 3.40 & 3.24 & 3.57 & 3.59 & 3.68 & 3.72 & 3.75 & 3.81 \\ + GCC/UINT & 3.45 & 3.24 & 3.36 & 3.48 & 3.61 & 3.64 & 3.67 & 3.72 \\ + GCC/SSE2 & 2.67 & 2.48 & 2.63 & 2.79 & 2.97 & 2.99 & 2.99 & 3.03 \\ + \hline +\end{tabular} + + +\caption{CRC-128 performance: Multiword CRC} \label{t:CRC128PerfMultiword} +\begin{tabular}{| l | c | c | c | c | c | c | c | c |} + \hline +Input size & 64 & 256 & 1K & 4K & 16K & 64K & 256K & 1M \\ + \hline +GCC/UINT/3 & 3.83 & 3.02 & 3.04 & 3.01 & 3.00 & 2.98 & 2.98 & 3.00 \\ + CL/SSE2/5 & 4.08 & 2.56 & 2.43 & 2.25 & 2.20 & 2.19 & 2.18 & 2.20 \\ +ICL/SSE2/5 & 3.52 & 2.33 & 2.23 & 2.05 & 2.00 & 1.99 & 1.99 & 2.01 \\ +GCC/SSE2/6 & 2.90 & 1.93 & 1.85 & 1.72 & 1.65 & 1.63 & 1.63 & 1.63 \\ + \hline +\end{tabular} +\end{center} + +Number of CPU cycles per byte. 128-bit CRC (CRC-128/IEEE polynomial), +64-bit platform, 128-bit tables, 64-bit reads. Warm data, warm tables. + +All compilers were tested using SSE2 intrinsics (/SSE2 variants). GCC was +also tested using 128-bit integers provided by the compiler (GCC/UINT). + +\begin{center} +\includegraphics[trim=14.25mm 50mm 16.75mm 50mm, width=0.99\textwidth]{CRC128-full.pdf} \label{f:CRC128Perf} +\end{center} + +{\it``Slicing"} implements algorithm described in section \ref{s:crcword}. + +{\it``Multiword/$N$"} implements algorithm described in section +\ref{s:multiword} processing $N$ data streams in parallel in interleaved +manner. The optimal (for given compiler) value of $N$ was used. + +\end{table} + +\end{document} diff --git a/crcutil-1.0/doc/text/data.xlsx b/crcutil-1.0/doc/text/data.xlsx new file mode 100644 index 0000000..02031f6 Binary files /dev/null and b/crcutil-1.0/doc/text/data.xlsx differ diff --git a/crcutil-1.0/doc/text/mk.cmd b/crcutil-1.0/doc/text/mk.cmd new file mode 100644 index 0000000..dd58343 --- /dev/null +++ b/crcutil-1.0/doc/text/mk.cmd @@ -0,0 +1,4 @@ +@echo off +pdflatex crc.tex +if not exist crc.bbl bibtex crc && pdflatex crc.tex && pdflatex crc.tex +start crc.pdf diff --git a/crcutil-1.0/examples/interface.cc b/crcutil-1.0/examples/interface.cc new file mode 100644 index 0000000..6c8a34f --- /dev/null +++ b/crcutil-1.0/examples/interface.cc @@ -0,0 +1,307 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// This is the only file where all details of CRC implementation are buried. + +#include "interface.h" + +#include "aligned_alloc.h" +#include "crc32c_sse4.h" +#include "generic_crc.h" +#include "protected_crc.h" +#include "rolling_crc.h" + +// Align all CRC tables on kAlign boundary. +// Shall be exact power of 2. +static size_t kAlign = 4 * 1024; + +using namespace crcutil; + +#if defined(__GNUC__) +// Suppress 'invalid access to non-static data member ... of NULL object' +#undef offsetof +#define offsetof(TYPE, MEMBER) (reinterpret_cast \ + ((&reinterpret_cast ( \ + reinterpret_cast (1)->MEMBER))) - 1) +#endif // defined(__GNUC__) + +namespace crcutil_interface { + +template + class Implementation : public CRC { + public: + typedef typename CrcImplementation::Crc Crc; + typedef Implementation Self; + + Implementation(const Crc &poly, + size_t degree, + bool canonical, + const Crc &roll_start_value, + size_t roll_length) + : crc_(poly, degree, canonical), + rolling_crc_(crc_, roll_length, roll_start_value) { + } + + static Self *Create(const Crc &poly, + size_t degree, + bool canonical, + const Crc &roll_start_value, + size_t roll_length, + const void **allocated_memory) { + void *memory = AlignedAlloc(sizeof(Self), + offsetof(Self, crc_), + kAlign, + allocated_memory); + return new(memory) Self(poly, + degree, + canonical, + roll_start_value, + roll_length); + } + + virtual void Delete() { + AlignedFree(this); + } + + void *operator new(size_t, void *p) { + return p; + } + + virtual void GeneratingPolynomial(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const { + SetValue(crc_.Base().GeneratingPolynomial(), lo, hi); + } + + virtual size_t Degree() const { + return crc_.Base().Degree(); + } + + virtual void CanonizeValue(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const { + SetValue(crc_.Base().Canonize(), lo, hi); + } + + virtual void RollStartValue(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const { + SetValue(rolling_crc_.StartValue(), lo, hi); + } + + virtual size_t RollWindowBytes() const { + return rolling_crc_.WindowBytes(); + } + + virtual void SelfCheckValue(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const { + Crc crc = crc_.CrcDefault(&crc_, sizeof(crc_), 0); + crc = crc_.CrcDefault(&rolling_crc_, sizeof(rolling_crc_), crc); + SetValue(crc, lo, hi); + } + + virtual void Compute(const void *data, + size_t bytes, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const { + SetValue(crc_.CrcDefault(data, bytes, GetValue(lo, hi)), lo, hi); + } + + virtual void RollStart(const void *data, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const { + SetValue(rolling_crc_.Start(data), lo, hi); + } + + virtual void Roll(size_t byte_out, + size_t byte_in, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const { + SetValue(rolling_crc_.Roll(GetValue(lo, hi), byte_out, byte_in), lo, hi); + } + + virtual void CrcOfZeroes(UINT64 bytes, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const { + SetValue(crc_.Base().CrcOfZeroes(bytes, GetValue(lo, hi)), lo, hi); + } + + virtual void ChangeStartValue( + UINT64 start_old_lo, UINT64 start_old_hi, + UINT64 start_new_lo, UINT64 start_new_hi, + UINT64 bytes, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const { + SetValue(crc_.Base().ChangeStartValue( + GetValue(lo, hi), + bytes, + GetValue(start_old_lo, start_old_hi), + GetValue(start_new_lo, start_new_hi)), + lo, + hi); + } + + virtual void Concatenate(UINT64 crcB_lo, UINT64 crcB_hi, + UINT64 bytes_B, + /* INOUT */ UINT64* crcA_lo, + /* INOUT */ UINT64* crcA_hi = NULL) const { + SetValue(crc_.Base().Concatenate(GetValue(crcA_lo, crcA_hi), + GetValue(crcB_lo, crcB_hi), + bytes_B), + crcA_lo, + crcA_hi); + } + + virtual size_t StoreComplementaryCrc( + void *dst, + UINT64 message_crc_lo, UINT64 message_crc_hi, + UINT64 result_crc_lo, UINT64 result_crc_hi = 0) const { + return crc_.Base().StoreComplementaryCrc( + dst, + GetValue(message_crc_lo, message_crc_hi), + GetValue(result_crc_lo, result_crc_hi)); + } + + virtual size_t StoreCrc(void *dst, + UINT64 lo, + UINT64 hi = 0) const { + return crc_.Base().StoreCrc(dst, GetValue(lo, hi)); + } + + virtual void CrcOfCrc(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const { + SetValue(crc_.Base().CrcOfCrc(), lo, hi); + } + + private: + static Crc GetValue(UINT64 *lo, UINT64 *hi) { + if (sizeof(Crc) <= sizeof(*lo)) { + return CrcFromUint64(*lo); + } else { + return CrcFromUint64(*lo, *hi); + } + } + + static Crc GetValue(UINT64 lo, UINT64 hi) { + return CrcFromUint64(lo, hi); + } + + static void SetValue(const Crc &crc, UINT64 *lo, UINT64 *hi) { + Uint64FromCrc(crc, + reinterpret_cast(lo), + reinterpret_cast(hi)); + } + + const CrcImplementation crc_; + const RollingCrcImplementation rolling_crc_; + + const Self &operator =(const Self &) {} +}; + +#if defined(_MSC_VER) +// 'use_sse4_2' : unreferenced formal parameter +#pragma warning(disable: 4100) +#endif // defined(_MSC_VER) + +bool CRC::IsSSE42Available() { +#if HAVE_AMD64 || HAVE_I386 + return Crc32cSSE4::IsSSE42Available(); +#else + return false; +#endif // HAVE_AMD64 || HAVE_I386 +} + +CRC::~CRC() {} +CRC::CRC() {} + +CRC *CRC::Create(UINT64 poly_lo, + UINT64 poly_hi, + size_t degree, + bool canonical, + UINT64 roll_start_value_lo, + UINT64 roll_start_value_hi, + size_t roll_length, + bool use_sse4_2, + const void **allocated_memory) { + if (degree == 0) { + return NULL; + } + + if (degree > 64) { +#if !HAVE_SSE2 + return NULL; +#else + if (degree > 128) { + return NULL; + } + uint128_sse2 poly = CrcFromUint64(poly_lo, poly_hi); + if (degree != 128 && (poly >> degree) != 0) { + return NULL; + } + uint128_sse2 roll_start_value = + CrcFromUint64(roll_start_value_lo, roll_start_value_hi); + if (degree != 128 && (roll_start_value >> degree) != 0) { + return NULL; + } +#if HAVE_I386 + typedef GenericCrc Crc128; +#elif defined(__GNUC__) && GCC_VERSION_AVAILABLE(4, 5) + typedef GenericCrc Crc128; +#else + typedef GenericCrc Crc128; +#endif // HAVE_I386 + return Implementation >::Create( + poly, + degree, + canonical, + roll_start_value, + roll_length, + allocated_memory); +#endif // !HAVE_SSE2 + } + +#if CRCUTIL_USE_MM_CRC32 && (HAVE_I386 || HAVE_AMD64) + if (use_sse4_2 && + degree == Crc32cSSE4::FixedDegree() && + poly_lo == Crc32cSSE4::FixedGeneratingPolynomial() && + poly_hi == 0) { + if (roll_start_value_hi != 0 || (roll_start_value_lo >> 32) != 0) { + return NULL; + } + return Implementation::Create( + static_cast(poly_lo), + degree, + canonical, + static_cast(roll_start_value_lo), + static_cast(roll_length), + allocated_memory); + } +#endif // CRCUTIL_USE_MM_CRC32 && (HAVE_I386 || HAVE_AMD64) + + if (poly_hi != 0 || (degree != 64 && (poly_lo >> degree) != 0)) { + return NULL; + } + if (roll_start_value_hi != 0 || + (degree != 64 && (roll_start_value_lo >> degree) != 0)) { + return NULL; + } + typedef GenericCrc + Crc64; + return Implementation >::Create( + poly_lo, + degree, + canonical, + roll_start_value_lo, + roll_length, + allocated_memory); +} + +} // namespace crcutil_interface diff --git a/crcutil-1.0/examples/interface.h b/crcutil-1.0/examples/interface.h new file mode 100644 index 0000000..2b3e2ee --- /dev/null +++ b/crcutil-1.0/examples/interface.h @@ -0,0 +1,204 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Example how to use CRC implementation via the interface which +// hides details of implementation. +// +// The raw implementation is not indended to be used in a project +// directly because: +// - Implementation lives in the header files because that is the +// only way to use templates efficiently. +// - Header files are quite "dirty" -- they define and use a +// lot of macros. Bringing these macros to all files in +// a project is not particularly good idea. +// - The code takes forever to compile with GCC (e.g. GCC +// 4.4.3 and 4.5.0 compile the unittest for about 30 seconds). +// +// Solution: +// - Create your own, clean interface. +// - Do not expose interface internals in a header file. +// - Proxy all calls to your interface to CRC implementation. +// - Keep only one copy of actual implementation. + +#ifndef CRCUTIL_INTERFACE_H_ +#define CRCUTIL_INTERFACE_H_ + +#include "std_headers.h" // size_t + +namespace crcutil_interface { + +// Many projects define their own uint64. Do it here. +typedef unsigned long long UINT64; + +class CRC { + public: + // Creates new instance of CRC class. + // If arguments are illegal (e.g. provided generating polynomial + // has more bits than provided degree), returns NULL. + // + // poly_* - generating polynomial (reversed bit format). + // degree - degree of generating polynomial. + // canonical - if true, input CRC value will be XOR'ed with + // (inverted) before and after CRC computation. + // roll_start_value - starting value of rolling CRC. + // roll_window_bytes - length of rolling CRC window in bytes. + // If roll_length is 0, roll_start_value + // shall be 0. + // use_sse4_2 - if true, use SSE4.2 crc32 instruction to compute + // CRC when generating polynomial is CRC32C (Castagnoli) + // allocated_memory - optional (may be NULL) address of a variable + // to store the address of actually allocated memory. + static CRC *Create(UINT64 poly_lo, + UINT64 poly_hi, + size_t degree, + bool canonical, + UINT64 roll_start_value_lo, + UINT64 roll_start_value_hi, + size_t roll_window_bytes, + bool use_sse4_2, + const void **allocated_memory); + + // Deletes the instance of CRC class. + virtual void Delete() = 0; + + // Returns true if SSE4.2 is available. + static bool IsSSE42Available(); + + // Returns generating polynomial. + virtual void GeneratingPolynomial(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const = 0; + + // Returns degree of generating polynomial. + virtual size_t Degree() const = 0; + + // Returns canonization constant used to XOR crc value + // before and after CRC computation. + virtual void CanonizeValue(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const = 0; + + // Returns rolling CRC starting value. + virtual void RollStartValue(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const = 0; + + // Returns length of rolling CRC window. + virtual size_t RollWindowBytes() const = 0; + + // Returns CRC of CRC tables to enable verification + // of integrity of CRC function itself by comparing + // the result with pre-computed value. + virtual void SelfCheckValue(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const = 0; + + // Given CRC value of previous chunk of data, + // extends it to new chunk, retuning the result in-place. + // + // If degree of CRC polynomial is 64 or less, + // (*hi) will not be touched. + virtual void Compute(const void *data, + size_t bytes, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const = 0; + + // Starts rolling CRC by computing CRC of first + // "roll_length" bytes of "data", using "roll_start_value" + // as starting value (see Create()). + // Should not be called if the value of "roll_value" was 0. + virtual void RollStart(const void *data, + /* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const = 0; + + // Rolls CRC by 1 byte, given the bytes leaving and + // entering the window of "roll_length" bytes. + // RollStart() should be called before "Roll". + // Should not be called if the value of "roll_value" was 0. + virtual void Roll(size_t byte_out, + size_t byte_in, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const = 0; + + // Computes CRC of sequence of zeroes -- without touching the data. + virtual void CrcOfZeroes(UINT64 bytes, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const = 0; + + // Computes value of CRC(A, bytes, start_new) given known + // crc=CRC(A, bytes, start_old) -- without touching the data. + virtual void ChangeStartValue( + UINT64 start_old_lo, UINT64 start_old_hi, + UINT64 start_new_lo, UINT64 start_new_hi, + UINT64 bytes, + /* INOUT */ UINT64 *lo, + /* INOUT */ UINT64 *hi = NULL) const = 0; + + // Returns CRC of concatenation of blocks A and B when CRCs + // of blocks A and B are known -- without touching the data. + // + // To be precise, given CRC(A, |A|, startA) and CRC(B, |B|, 0), + // returns CRC(AB, |AB|, startA). + virtual void Concatenate(UINT64 crcB_lo, UINT64 crcB_hi, + UINT64 bytes_B, + /* INOUT */ UINT64* crcA_lo, + /* INOUT */ UINT64* crcA_hi = NULL) const = 0; + + // Given CRC of a message, stores extra (degree + 7)/8 bytes after + // the message so that CRC(message+extra, start) = result. + // Does not change CRC start value (use ChangeStartValue for that). + // Returns number of stored bytes. + virtual size_t StoreComplementaryCrc( + void *dst, + UINT64 message_crc_lo, UINT64 message_crc_hi, + UINT64 result_crc_lo, UINT64 result_crc_hi = 0) const = 0; + + // Stores given CRC of a message as (degree + 7)/8 bytes filled + // with 0s to the right. Returns number of stored bytes. + // CRC of the message and stored CRC is a constant value returned + // by CrcOfCrc() -- it does not depend on contents of the message. + virtual size_t StoreCrc(/* OUT */ void *dst, + UINT64 lo, + UINT64 hi = 0) const = 0; + + // Computes expected CRC value of CRC(Message,CRC(Message)) + // when CRC is stored after the message. This value is fixed + // and does not depend on the message or CRC start value. + virtual void CrcOfCrc(/* OUT */ UINT64 *lo, + /* OUT */ UINT64 *hi = NULL) const = 0; + + protected: + // CRC instance should be created only once (most of the time): + // - Creation and initializion is relatively expensive. + // - CRC is fully defined by its generating polynomials + // (well, and few more parameters). + // - CRC instances are pure constants. There is no + // reason to have 2 instances of the same CRC. + // - There are not too many generating polynomials that are + // used on practice. It is hard to imagine a project + // which uses 50 different generating polynomials. + // Thus, a handful of CRC instances is sufficient + // to cover the needs of even very large project. + // - Finally and most importantly, CRC tables should be + // aligned properly. No, the instances of CRC class + // are not created by blind "new" -- they use placement + // "new" and, in absense of placement "delete", + // should be deleted by calling explicit Delete() method. + virtual ~CRC(); + + // Cannot instantiate the class -- instances may be created + // by CRC::Create() only. + CRC(); +}; + +} // namespace crcutil_interface + + +#endif // CRCUTIL_INTERFACE_H_ diff --git a/crcutil-1.0/examples/usage.cc b/crcutil-1.0/examples/usage.cc new file mode 100644 index 0000000..10c59fd --- /dev/null +++ b/crcutil-1.0/examples/usage.cc @@ -0,0 +1,209 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "std_headers.h" +#include "interface.h" + +static const size_t kRollWindow = 4; +static const unsigned char kTestData[] = "abcdefgh"; + +static const int kTestDataHead = + static_cast((sizeof(kTestData) - 1) / 4); +static const int kTestDataTail = + static_cast(sizeof(kTestData) - 1 - kTestDataHead); + +typedef crcutil_interface::UINT64 uint64; + +// GCC -- up to 4.5.0 inclusively -- is not aware that the right format +// to print "long long" is "%ll[oudx]". Such nonsense does not prevent +// it from complaining about format mismatch, though. Here is the cure. +void xprintf(const char *format, ...) { + va_list va; + va_start(va, format); + vprintf(format, va); + va_end(va); + fflush(stdout); +} + +// +// Please notice that when working with 64-bit and smaller CRCs, +// the use of "hi" part of CRC value is unnecessary. +// +void Show(const crcutil_interface::CRC *crc) { + char buffer[sizeof(kTestData) + 32]; + + // + // Access CRC properties. + // + uint64 lo; + crc->GeneratingPolynomial(&lo); + xprintf("Generating polynomial 0x%llx, degree %llu", + lo, + static_cast(crc->Degree())); + crc->CanonizeValue(&lo); + xprintf(", canonize_value=0x%llx", lo); + + crc->RollStartValue(&lo); + xprintf(", roll start value=0x%llx, roll window=%llu", + lo, + static_cast(crc->RollWindowBytes())); + + // + // Check integrity of CRC tables. + // + crc->SelfCheckValue(&lo); + xprintf(", self check value 0x%llx\n", lo); + + // + // Compute CRC. + // + lo = 0; + crc->Compute(kTestData, sizeof(kTestData) - 1, &lo); + xprintf("CRC32C(\"%s\") = 0x%llx\n", kTestData, lo); + + // + // Compute CRC (incrementally). + // + lo = 0; + crc->Compute(kTestData, kTestDataHead, &lo); + xprintf("CRC32C(\"%.*s\", 0) = 0x%llx, ", kTestDataHead, kTestData, lo); + crc->Compute(kTestData + kTestDataHead, kTestDataTail, &lo); + xprintf("CRC32C(\"%s\", CRC32(\"%.*s\", 0)) = 0x%llx = CRC32(\"%s\")\n", + kTestData + kTestDataHead, kTestDataHead, kTestData, lo, kTestData); + + // + // Compute CRC of a message filled with 0s. + // + lo = 1; + crc->CrcOfZeroes(sizeof(buffer), &lo); + + uint64 lo1 = 1; + memset(buffer, 0, sizeof(buffer)); + crc->Compute(buffer, sizeof(buffer), &lo1); + xprintf("CRC of %d zeroes = %llx, expected %llx\n", + static_cast(sizeof(buffer)), + lo, + lo1); + + + // + // Use rolling CRC. + // + xprintf("RollingCrc expected ="); + for (size_t i = 0; i <= kRollWindow; ++i) { + crc->RollStartValue(&lo); + crc->Compute(kTestData + i, kRollWindow, &lo); + xprintf(" 0x%llx", lo); + } + xprintf("\n"); + + crc->RollStart(kTestData, &lo, NULL); + xprintf("RollingCrc actual = 0x%llx", lo); + for (size_t i = 1; i <= kRollWindow; ++i) { + crc->Roll(kTestData[i - 1], kTestData[i - 1 + kRollWindow], &lo, NULL); + xprintf(" 0x%llx", lo); + } + xprintf("\n"); + + // + // Change initial value. + // + lo = 0; + crc->Compute(kTestData, sizeof(kTestData) - 1, &lo); + uint64 lo1_expected = 1; + crc->Compute(kTestData, sizeof(kTestData) - 1, &lo1_expected); + lo1 = lo; + crc->ChangeStartValue(0, 0, // old start value + 1, 0, // new start value + sizeof(kTestData) - 1, + &lo1); + xprintf("CRC(\"%s\", 0) = 0x%llx, CRC(\"%s\", 1)=0x%llx, expected 0x%llx\n", + kTestData, lo, kTestData, lo1, lo1_expected); + + // + // Concatenate CRCs. + // + uint64 start_value = 1; + lo = start_value; + crc->Compute(kTestData, kTestDataHead, &lo); + lo1 = 0; + crc->Compute(kTestData + kTestDataHead, kTestDataTail, &lo1); + + uint64 lo2 = lo; + crc->Concatenate(lo1, 0, kTestDataTail, &lo2); + + uint64 lo2_expected = start_value; + crc->Compute(kTestData, sizeof(kTestData) - 1, &lo2_expected); + + xprintf("CRC(\"%.*s\", 1) = 0x%llx, CRC(\"%s\", 0)=0x%llx, " + "CRC(\"%s\", 1) = 0x%llx, expected 0x%llx\n", + kTestDataHead, kTestData, lo, + kTestData + kTestDataHead, lo1, + kTestData, lo2, + lo2_expected); + + // + // Store complementary CRC so that CRC of a message followed + // by complementary CRC value produces predefined result (e.g. 0). + // + memcpy(buffer, kTestData, sizeof(kTestData) - 1); + lo = 1; + crc->Compute(buffer, sizeof(kTestData) - 1, &lo); + size_t stored_crc_bytes = crc->StoreComplementaryCrc( + buffer + sizeof(kTestData) - 1, + lo, 0, + 0); + + // Compute CRC of message + complementary CRC using the same start value + // (start value could be changed via ChangeStartValue()). + lo1 = 1; + crc->Compute(buffer, sizeof(kTestData) - 1 + stored_crc_bytes, &lo1); + + xprintf("Crc of message + complementary CRC = %llx, expected 0\n", lo1); + + // + // Store CRC after the message and ensure that CRC of message + its + // CRC produces constant result irrespective of message data. + // + memcpy(buffer, kTestData, sizeof(kTestData) - 1); + lo = 1; + crc->Compute(buffer, sizeof(kTestData) - 1, &lo); + stored_crc_bytes = crc->StoreCrc(buffer + sizeof(kTestData) - 1, lo); + + // Compute CRC of message + its CRC using start value of 0. + lo1 = 1; + crc->Compute(buffer, sizeof(kTestData) - 1 + stored_crc_bytes, &lo1); + + // Ensure that it matches "predicted" constant value, irrespective + // of a message or CRC start value. + crc->CrcOfCrc(&lo2); + xprintf("CrcOfCrc=%llx, expected %llx\n", lo1, lo2); + + xprintf("\n"); +} + +void ShowAndDelete(crcutil_interface::CRC *crc) { + Show(crc); + crc->Delete(); +} + +int main() { + ShowAndDelete(crcutil_interface::CRC::Create( + 0xEB31D82E, 0, 32, true, 0x1111, 0, kRollWindow, + crcutil_interface::CRC::IsSSE42Available(), NULL)); + ShowAndDelete(crcutil_interface::CRC::Create( + 0x82f63b78, 0, 32, true, 0x2222, 0, kRollWindow, + crcutil_interface::CRC::IsSSE42Available(), NULL)); + return 0; +} diff --git a/crcutil-1.0/install-sh b/crcutil-1.0/install-sh new file mode 100755 index 0000000..6781b98 --- /dev/null +++ b/crcutil-1.0/install-sh @@ -0,0 +1,520 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2009-04-28.21; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +nl=' +' +IFS=" "" $nl" + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit=${DOITPROG-} +if test -z "$doit"; then + doit_exec=exec +else + doit_exec=$doit +fi + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_glob='?' +initialize_posix_glob=' + test "$posix_glob" != "?" || { + if (set -f) 2>/dev/null; then + posix_glob= + else + posix_glob=: + fi + } +' + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +no_target_directory= + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *' '* | *' +'* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) dst_arg=$2 + shift;; + + -T) no_target_directory=true;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + trap '(exit $?); exit' 1 2 13 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dst_arg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test -n "$no_target_directory"; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + # Prefer dirname, but fall back on a substitute if dirname fails. + dstdir=` + (dirname "$dst") 2>/dev/null || + expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$dst" : 'X\(//\)[^/]' \| \ + X"$dst" : 'X\(//\)$' \| \ + X"$dst" : 'X\(/\)' \| . 2>/dev/null || + echo X"$dst" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q' + ` + + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writeable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + -*) prefix='./';; + *) prefix='';; + esac + + eval "$initialize_posix_glob" + + oIFS=$IFS + IFS=/ + $posix_glob set -f + set fnord $dstdir + shift + $posix_glob set +f + IFS=$oIFS + + prefixes= + + for d + do + test -z "$d" && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + + eval "$initialize_posix_glob" && + $posix_glob set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + $posix_glob set +f && + + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/crcutil-1.0/missing b/crcutil-1.0/missing new file mode 100755 index 0000000..28055d2 --- /dev/null +++ b/crcutil-1.0/missing @@ -0,0 +1,376 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2009-04-28.21; # UTC + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006, +# 2008, 2009 Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# 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, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: +sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' +sed_minuso='s/.* -o \([^ ]*\).*/\1/p' + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case $1 in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + autom4te touch the output file, or create a stub one + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and +\`g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + +esac + +# normalize program name to check for. +program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + +# Now exit if we have it, but it failed. Also exit now if we +# don't have it and --version was passed (most likely to detect +# the program). This is about non-GNU programs, so use $1 not +# $program. +case $1 in + lex*|yacc*) + # Not GNU programs, they don't have --version. + ;; + + tar*) + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + exit 1 + fi + ;; + + *) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + elif test "x$2" = "x--version" || test "x$2" = "x--help"; then + # Could not run --version or --help. This is probably someone + # running `$TOOL --version' or `$TOOL --help' to check whether + # $TOOL exists and not knowing $TOOL uses missing. + exit 1 + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case $program in + aclocal*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case $f in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te*) + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison*|yacc*) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if test ! -f y.tab.h; then + echo >y.tab.h + fi + if test ! -f y.tab.c; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex*|flex*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if test $# -ne 1; then + eval LASTARG="\${$#}" + case $LASTARG in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if test -f "$SRCFILE"; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if test ! -f lex.yy.c; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit $? + fi + ;; + + makeinfo*) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + # The file to touch is that specified with -o ... + file=`echo "$*" | sed -n "$sed_output"` + test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` + if test -z "$file"; then + # ... or it is the one specified with @setfilename ... + infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n ' + /^@setfilename/{ + s/.* \([^ ]*\) *$/\1/ + p + q + }' $infile` + # ... or it is derived from the source name (dir/f.texi becomes f.info) + test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info + fi + # If the file does not exist, the user really needs makeinfo; + # let's fail without touching anything. + test -f $file || exit 1 + touch $file + ;; + + tar*) + shift + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case $firstarg in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case $firstarg in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "; # UTC" +# End: diff --git a/crcutil-1.0/tests/aligned_alloc.h b/crcutil-1.0/tests/aligned_alloc.h new file mode 100644 index 0000000..37cefba --- /dev/null +++ b/crcutil-1.0/tests/aligned_alloc.h @@ -0,0 +1,66 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Poor man's platform-independent implementation of aligned memory allocator. + +#ifndef CRCUTIL_ALIGNED_ALLOC_H_ +#define CRCUTIL_ALIGNED_ALLOC_H_ + +#include "std_headers.h" // size_t, ptrdiff_t + +namespace crcutil { + +// Allocates a block of memory of "size" bytes so that a field +// at "field_offset" is aligned on "align" boundary. +// +// NB #1: "align" shall be exact power of two. +// +// NB #2: memory allocated by AlignedAlloc should be release by AlignedFree(). +// +inline void *AlignedAlloc(size_t size, + size_t field_offset, + size_t align, + const void **allocated_mem) { + if (align == 0 || (align & (align - 1)) != 0 || align < sizeof(char *)) { + align = sizeof(*allocated_mem); + } + size += align - 1 + sizeof(*allocated_mem); + char *allocated_memory = new char[size]; + char *aligned_memory = allocated_memory + sizeof(*allocated_mem); + field_offset &= align - 1; + size_t actual_alignment = + reinterpret_cast(aligned_memory + field_offset) & (align - 1); + if (actual_alignment != 0) { + aligned_memory += align - actual_alignment; + } + reinterpret_cast(aligned_memory)[-1] = allocated_memory; + + if (allocated_mem != NULL) { + *allocated_mem = allocated_memory; + } + + return aligned_memory; +} + +// Frees memory allocated by AlignedAlloc(). +inline void AlignedFree(void *aligned_memory) { + if (aligned_memory != NULL) { + char *allocated_memory = reinterpret_cast(aligned_memory)[-1]; + delete[] allocated_memory; + } +} + +} // namespace crcutil + +#endif // CRCUTIL_ALIGNED_ALLOC_H_ diff --git a/crcutil-1.0/tests/bob_jenkins_rng.h b/crcutil-1.0/tests/bob_jenkins_rng.h new file mode 100644 index 0000000..aed178c --- /dev/null +++ b/crcutil-1.0/tests/bob_jenkins_rng.h @@ -0,0 +1,126 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Glorified C++ version of Bob Jenkins' random number generator. +// See http://burtleburtle.net/bob/rand/smallprng.html for more details. + +#ifndef CRCUTIL_BOB_JENKINS_RNG_H_ +#define CRCUTIL_BOB_JENKINS_RNG_H_ + +#include "base_types.h" + +#if !defined(_MSC_VER) +#define _rotl(value, bits) \ + static_cast(((value) << (bits)) + ((value) >> (32 - (bits)))) +#define _rotl64(value, bits) \ + static_cast(((value) << (bits)) + ((value) >> (64 - (bits)))) +#endif // !defined(_MSC_VER) + +namespace crcutil { + +#pragma pack(push, 8) + +template class BobJenkinsRng; + +template<> class BobJenkinsRng { + public: + typedef uint32 value; + + value Get() { + value e = a_ - _rotl(b_, 23); + a_ = b_ ^ _rotl(c_, 16); + b_ = c_ + _rotl(d_, 11); + c_ = d_ + e; + d_ = e + a_; + return (d_); + } + + void Init(value seed) { + a_ = 0xf1ea5eed; + b_ = seed; + c_ = seed; + d_ = seed; + for (size_t i = 0; i < 20; ++i) { + (void) Get(); + } + } + + explicit BobJenkinsRng(value seed) { + Init(seed); + } + + BobJenkinsRng() { + Init(0x1234567); + } + + private: + value a_; + value b_; + value c_; + value d_; +}; + + +#if HAVE_UINT64 + +template<> class BobJenkinsRng { + public: + typedef uint64 value; + + value Get() { + value e = a_ - _rotl64(b_, 7); + a_ = b_ ^ _rotl64(c_, 13); + b_ = c_ + _rotl64(d_, 37); + c_ = d_ + e; + d_ = e + a_; + return d_; + } + + void Init(value seed) { + a_ = 0xf1ea5eed; + b_ = seed; + c_ = seed; + d_ = seed; + for (size_t i = 0; i < 20; ++i) { + (void) Get(); + } + } + + explicit BobJenkinsRng(value seed) { + Init(seed); + } + + BobJenkinsRng() { + Init(0x1234567); + } + + private: + value a_; + value b_; + value c_; + value d_; +}; + +#endif // HAVE_UINT64 + +#if !defined(_MSC_VER) +#undef _rotl +#undef _rotl64 +#endif // !defined(_MSC_VER) + +#pragma pack(pop) + +} // namespace crcutil + +#endif // CRCUTIL_BOB_JENKINS_RNG_H_ diff --git a/crcutil-1.0/tests/rdtsc.h b/crcutil-1.0/tests/rdtsc.h new file mode 100644 index 0000000..57aea1f --- /dev/null +++ b/crcutil-1.0/tests/rdtsc.h @@ -0,0 +1,59 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Reads CPU cycle counter on AMD64 and I386 (for performance measurements). +// Thanks to __rdtsc() intrinsic, it's easy with Microsoft and Intel +// compilers, but real pain with GCC. + +#ifndef CRCUTIL_RDTSC_H_ +#define CRCUTIL_RDTSC_H_ + +#include "platform.h" + +namespace crcutil { + +struct Rdtsc { + static inline uint64 Get() { +#if defined(_MSC_VER) && (HAVE_AMD64 || HAVE_I386) + return __rdtsc(); +#elif defined(__GNUC__) && HAVE_AMD64 + int64 result; + __asm__ volatile( + "rdtsc\n" + : "=a" (result)); + return result; +#elif defined(__GNUC__) && HAVE_I386 + // If "low" and "high" are defined as "uint64" to + // avoid explicit cast to uint64, GCC 4.5.0 in "-m32" mode + // fails with "impossible register constraint" error + // (no, it is not because one cannot use 64-bit value as argument + // for 32-bit register, but because its register allocator + // could not resolve a conflict under high register pressure). + uint32 low; + uint32 high; + __asm__ volatile( + "rdtsc\n" + : "=a" (low), "=d" (high)); + return ((static_cast(high) << 32) | low); +#else + // It is hard to find low overhead timer with + // sub-millisecond resolution and granularity. + return 0; +#endif + } +}; + +} // namespace crcutil + +#endif // CRCUTIL_RDTSC_H_ diff --git a/crcutil-1.0/tests/set_hi_pri.c b/crcutil-1.0/tests/set_hi_pri.c new file mode 100644 index 0000000..a555bf3 --- /dev/null +++ b/crcutil-1.0/tests/set_hi_pri.c @@ -0,0 +1,55 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Raises priority of test process and main thread to reduce +// timing variations caused by context switches. Windows only. + +#if defined(_MSC_VER) +// Disable warnings generated by "windows.h" compiled with -Wall. + +// N bytes padding added after data member X +#pragma warning(disable: 4820) + +// no function prototype given: converting '()' to '(void)' +#pragma warning(disable: 4255) + +// '__midl' is not defined as a preprocessor macro, +// replacing with '0' for '#if/#elif' +#pragma warning(disable: 4668) + +#endif // defined(_MSC_VER) + + +#if defined(_WIN32) +#include +#endif // defined(_WIN32) + +#ifdef __cplusplus +extern "C" +#endif // __cplusplus +void SetHiPri(void) +{ +#if defined(_WIN32) +#if 1 + // These setting are extremely dangerous. E.g. if app hits infinite loop, + // computer may turn unresponsive and will require a power cycle. + // Use for final testing only. + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL); + SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); +#else + SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST); + SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS); +#endif +#endif // defined(_WIN32) +} diff --git a/crcutil-1.0/tests/unittest.cc b/crcutil-1.0/tests/unittest.cc new file mode 100644 index 0000000..bd6306b --- /dev/null +++ b/crcutil-1.0/tests/unittest.cc @@ -0,0 +1,176 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "unittest.h" + +extern "C" void SetHiPri(); + +using namespace crcutil; + +#if !defined(HAVE_INT128) +#if defined(__GNUC__) && HAVE_AMD64 +#define HAVE_INT128 1 +#else +#define HAVE_INT128 0 +#endif // defined(__GNUC__) && HAVE_AMD64 +#endif // defined(HAVE_INT128) + +#if HAVE_INT128 +typedef unsigned int uint128_t __attribute__((mode(TI))); +#endif // HAVE_INT128 + +int main(int argc, char **argv) { + bool test_perf_main = true; + bool test_perf_all = false; + bool canonical = false; + + for (int i = 1; i < argc; ++i) { + if (strcmp(argv[i], "--noperf") == 0) { + test_perf_main = false; + test_perf_all = false; + } else if (strcmp(argv[i], "--perfall") == 0) { + test_perf_all = true; + } else if (strcmp(argv[i], "--canonical") == 0) { + canonical = true; + } else if (strcmp(argv[i], "help") == 0) { + fprintf(stderr, "Usage: unittest {options}\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " --canonical - test canonical variant of CRC\n"); + fprintf(stderr, " --noperf - do not test performance\n"); + fprintf(stderr, " --perfall - test performance of all CRC width " + "(not just 32, 64, and 128)\n"); + fprintf(stderr, "\n"); + return 1; + } + } + + + SetHiPri(); + + CrcVerifier v; + + CreateTest( + 64, 0, 0x9a6c9329ac4bc9b5ull, "u64/u64/u64", test_perf_main, &v); + CreateTest( + 64, 0, 0x9a6c9329ac4bc9b5ull, "u64/u64/u32", test_perf_all, &v); + + CreateTest( + 32, 0, 0x82f63b78, "u64/u64/u64", test_perf_main, &v); + CreateTest( + 32, 0, 0x82f63b78, "u32/u32/u32", test_perf_main, &v); + + CreateTest( + 32, 0, 0x82f63b78, "u64/u32/u32", test_perf_all, &v); + CreateTest( + 32, 0, 0x82f63b78, "u64/u32/u64", test_perf_all, &v); + + CreateTest( + 15, 0, 0x00004CD1, "u64/u64/u64", test_perf_all, &v); + CreateTest( + 15, 0, 0x00004CD1, "u32/u32/u32", test_perf_all, &v); + + CreateTest( + 07, 0, 0x00000048, "u64/u64/u64", test_perf_all, &v); + CreateTest( + 07, 0, 0x00000048, "u32/u32/u32", test_perf_all, &v); + +#if HAVE_SSE2 + CreateTest( + 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "sse2/sse2/u64", test_perf_main, &v); + CreateTest( + 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "sse2/sse2/u32", test_perf_main, &v); + CreateTest( + 64, 0, 0x9a6c9329ac4bc9b5ull, + "sse2/sse2/u64", test_perf_main, &v); + CreateTest( + 64, 0, 0x9a6c9329ac4bc9b5ull, + "sse2/sse2/u32", test_perf_main, &v); + CreateTest( + 32, 0, 0x82f63b78, + "sse2/sse2/u64", test_perf_main, &v); + CreateTest( + 32, 0, 0x82f63b78, + "sse2/sse2/u32", test_perf_main, &v); +#endif // HAVE_SSE2 +#if HAVE_INT128 + CreateTest( + 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "u128/u128/u64", test_perf_main, &v); + CreateTest( + 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "u128/u128/u32", test_perf_main, &v); +#endif // HAVE_INT128 + + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/2", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/3", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/4", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/5", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/6", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/7", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 64, 0, 0x9a6c9329ac4bc9b5ull, "CRC-64-64/64/8", test_perf_main, true)); + +#if HAVE_SSE2 + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/2", test_perf_main, true)); + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/3", test_perf_main, true)); + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/4", test_perf_main, true)); + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/5", test_perf_main, true)); + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/6", test_perf_main, true)); + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/7", test_perf_main, true)); + v.add(new CrcVerifierFactory( + canonical, 128, 0xeca61dca77452c88ull, 0x21fe865c87bc0e61ull, + "CRC-128-sse2/size_t/8", test_perf_main, true)); +#endif // HAVE_SSE2 + + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/2", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/3", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/4", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/5", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/6", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/7", test_perf_main, true)); + v.add(new CrcVerifierFactory(canonical, + 32, 0, 0x82f63b78, "CRC-32-size_t/size_t/8", test_perf_main, true)); + + v.TestFunctionality(); + v.TestPerformance(); + + return (0); +} diff --git a/crcutil-1.0/tests/unittest.h b/crcutil-1.0/tests/unittest.h new file mode 100644 index 0000000..ba6cce5 --- /dev/null +++ b/crcutil-1.0/tests/unittest.h @@ -0,0 +1,1105 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Functionality and performance tests of available CRC implementations. + +#ifndef CRCUTIL_UNITTEST_H_ +#define CRCUTIL_UNITTEST_H_ + +#if defined(_MSC_VER) +#define _CRT_SECURE_NO_WARNINGS +#pragma warning(push) +#pragma warning(disable: 4820) // structure was padded +#pragma warning(disable: 4710) // function not inlined +// C++ exception handler used, but unwind +// semantics are not enabled. Specify /EHsc +#pragma warning(disable: 4530) +#endif // defined(_MSC_VER) + +#include +#include +#include + +#if defined(_MSC_VER) +#pragma warning(pop) +#endif // defined(_MSC_VER) + +#include "aligned_alloc.h" +#include "bob_jenkins_rng.h" +#include "crc32c_sse4.h" +#include "generic_crc.h" +#include "rdtsc.h" +#include "rolling_crc.h" +#include "unittest_helper.h" + +namespace crcutil { + +#if defined(_INTEL_COMPILER) +#pragma warning(push) +#pragma warning(disable: 185) // dynamic initialization in unreachable code +#endif // defined(_INTEL_COMPILER) + +#if HAVE_AMD64 || HAVE_I386 + +class Crc32cSSE4_Test : public Crc32cSSE4 { + public: + void *operator new(size_t, void *p) { + return p; + } +}; + +template +class GenericCrcTest : public GenericCrc { + public: + ~GenericCrcTest() { + AlignedFree(aligned_memory_); + } + + void InitWithCrc32c(const Crc &generating_polynomial, + size_t degree, + bool constant) { + this->Init(generating_polynomial, degree, constant); + + crc32c_ = NULL; + aligned_memory_ = NULL; + + // Bug in GCC 4.4.3: if (kStride == 4) comparison is put first + // so that the compiler may optimize out entire "if" statement, + // GCC 4.4.3 at -O3 level generates incorrect code corrupting "this". + if (degree == Crc32cSSE4::FixedDegree() && + generating_polynomial == Crc32cSSE4::FixedGeneratingPolynomial() && + (!CRCUTIL_USE_MM_CRC32 || Crc32cSSE4::IsSSE42Available()) && + kStride == 4 && + sizeof(Crc) == sizeof(size_t)) { + aligned_memory_ = AlignedAlloc(sizeof(*crc32c_), 0, 256, NULL); + crc32c_ = new(aligned_memory_) Crc32cSSE4_Test; + crc32c_->Init(constant); + } + } + + bool HaveCrc32c() const { + return (crc32c_ != NULL); + } + + Crc CRC32C(const void *data, size_t bytes, const Crc &start) const { + return static_cast( + crc32c_->CrcDefault(data, bytes, Downcast(start))); + } + + private: + Crc32cSSE4_Test *crc32c_; + void *aligned_memory_; +}; + +#else + +template +class GenericCrcTest : public GenericCrc { + public: + ~GenericCrcTest() {} + void InitWithCrc32c(const Crc &generating_polynomial, + size_t degree, + bool constant) { + Init(generating_polynomial, degree, constant); + } + + bool HaveCrc32c() const { + return false; + } + + Crc CRC32C(const void * /* data */, + size_t /* bytes */, + const Crc & /* start */) const { + return 0; + } +}; + +#endif // HAVE_AMD64 || HAVE_I386 + +// Forward declaration. +class PerfTestState; + +class CrcVerifierInterface { + public: + virtual void TestFunctionality(const char *class_title) const = 0; + virtual void TestPerformance(FILE *output, + PerfTestState *state, + bool multiword_only, + const char *class_title) = 0; + CrcVerifierInterface() {} + + protected: + virtual ~CrcVerifierInterface() {} +}; + +// Finds the most efficient implementation algorithm for +// given CRC. +class AlgSorter { + public: + void Add(std::string crc_name, std::string alg_name, double cycles) { + CrcInfo *crc_info = crcs_[crc_name]; + if (crc_info == NULL) { + crc_info = new CrcInfo; + crcs_[crc_name] = crc_info; + } + AlgStat *alg_stat = (*crc_info)[alg_name]; + if (alg_stat == NULL) { + alg_stat = new AlgStat; + alg_stat->name = alg_name; + alg_stat->cycles = 0; + alg_stat->tests = 0; + (*crc_info)[alg_name] = alg_stat; + } + alg_stat->cycles += cycles; + alg_stat->tests += 1; + } + + void PrintBest() { + for (Crcs::const_iterator it = crcs_.begin(); it != crcs_.end(); ++it) { + PrintBestCrc(it->first, *(it->second)); + } + } + + private: + struct AlgStat { + std::string name; + double cycles; + int tests; + }; + + typedef std::map CrcInfo; + typedef std::map Crcs; + + struct AlgStatCompare { + bool operator()(const AlgStat *a, const AlgStat *b) const { + return ((a->cycles / a->tests) < (b->cycles / b->tests)); + } + }; + + void PrintBestCrc(std::string crc_name, const CrcInfo &crc_info) { + typedef std::set SortedAlgStat; + SortedAlgStat alg_set; + for (CrcInfo::const_iterator it = crc_info.begin(); + it != crc_info.end(); + ++it) { + alg_set.insert(it->second); + } + printf("%s\n", crc_name.c_str()); + for (SortedAlgStat::const_iterator it = alg_set.begin(); + it != alg_set.end(); + ++it) { + printf(" %-28s %6.3f cycles/byte\n", + (*it)->name.c_str(), + (*it)->cycles / (*it)->tests); + } + printf("\n"); + } + + Crcs crcs_; +}; + + +class PerfTestState { + public: + enum { + MAX_TEST_COUNT = 100, + }; + + explicit PerfTestState(FILE *output) + : output_(output), test_count_(0), title_printed_(false) {} + ~PerfTestState() {} + + void Add(uint32 bytes, const char *name, double cycles) { + if (test_count_ < MAX_TEST_COUNT) { + bytes_ = bytes; + test_[test_count_].name = name; + test_[test_count_].cycles = cycles; + test_count_ += 1; + } + + if (bytes >= 1024 && bytes <= 1024 * 1024 && + memcmp(name, "MemSpeed", 9) != 0) { + crc_sorter_.Add(crc_name_, std::string(name) + "-" + alg_name_, cycles); + } + } + + void Print() { + if (!title_printed_) { + for (size_t i = 0; i < test_count_; ++i) { + fprintf(output_, ", %s", test_[i].name); + } + fprintf(output_, ",, BestTime, BestMethod"); + fprintf(output_, "\n"); + fflush(output_); + title_printed_ = true; + } + double min_cycles = 1e30; + size_t min_index = 0; + fprintf(output_, "%9u", bytes_); + for (size_t i = 0; i < test_count_; ++i) { + fprintf(output_, ", %6.3f", test_[i].cycles); + if (min_cycles > test_[i].cycles && + memcmp(test_[i].name, "MemSpeed", 9) != 0) { + min_cycles = test_[i].cycles; + min_index = i + 1; + } + } + if (min_index != 0) { + min_index -= 1; + fprintf(output_, + ",, %6.3f, %s", + test_[min_index].cycles, + test_[min_index].name); + } + fprintf(output_, "\n"); + fflush(output_); + test_count_ = 0; + } + + void Finish() { + fprintf(output_, "\n"); + fflush(output_); + test_count_ = 0; + title_printed_ = false; + } + + void StartNewCrc(const char *name) { + // Assuming the name is in following format: + // CRC-NNN-ALG-MODE where + // NNN - CRC width + // ALG - algorithm + // MODE - mode (raw or canonical) + const char *second_dash; + second_dash = strchr(name, '-'); + if (second_dash != NULL) { + second_dash = strchr(second_dash + 1, '-'); + } + if (second_dash == NULL) { + second_dash = name + strlen(name); + } + std::string str_name(name, static_cast(second_dash - name)); + crc_name_ = str_name; + + if (*second_dash == '-') { + ++second_dash; + } + const char *last_dash = strrchr(second_dash, '-'); + if (last_dash == NULL) { + last_dash = name + strlen(name); + } + std::string str_alg_name(second_dash, + static_cast(last_dash - second_dash)); + alg_name_ = str_alg_name; + } + + void PrintBest() { + crc_sorter_.PrintBest(); + } + + private: + PerfTestState(); + + FILE *output_; + size_t test_count_; + bool title_printed_; + uint32 bytes_; + struct { + const char *name; + double cycles; + } test_[MAX_TEST_COUNT]; + + std::string crc_name_; + std::string alg_name_; + AlgSorter crc_sorter_; +}; + +template + class RollingCrcTest + : public RollingCrc { + public: + void *operator new(size_t, void *p) { + return p; + } +}; + +template + class CrcTest : public GenericCrcTest, + public CrcVerifierInterface { + public: + typedef CrcTest CrcTestSelf; + typedef RollingCrcTest< GenericCrc > + RollingCrcSelf; + + typedef Crc(CrcTestSelf::*CrcCallback) ( + const void *data, size_t bytes, const Crc &start) const; + + void *operator new(size_t, void *p) { + return p; + } + + void VerifyPow() const { + Crc x = this->Base().One() >> 1; + Crc x_pow_i = x; + for (size_t i = 1; i < 1024; ++i) { + Crc value = this->Base().XpowN(i); + CHECK_EQ(x_pow_i, value); + x_pow_i = this->Base().Multiply(x_pow_i, x); + } + } + + void VerifyCrcZeroes() const { + uint8 buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t k = 0; k < 256; ++k) { + Crc zero_old = this->CrcByte(buf, k, 1); + Crc zero_new = this->Base().CrcOfZeroes(k, 1); + CHECK_EQ(zero_old, zero_new); + } + } + + void VerifyChangeStartValue() const { +#if defined(_MSC_VER) && _MSC_FULL_VER <= 150030729 && defined(_M_IX86) + // Work around a bug in CL. + if (sizeof(Crc) > 8) { + return; + } +#endif // defined(_MSC_VER) && _MSC_FULL_VER < 150030729 && defined(_M_IX86) + uint8 buf[256]; + BobJenkinsRng rng; + for (size_t i = 0; i < 256; ++i) { + buf[i] = static_cast(rng.Get()); + } + + for (size_t n = 1; n < 256 && (n >> this->Base().Degree()) == 0; ++n) { + for (size_t i = 0; + i < 4096 && (i >> this->Base().Degree()) == 0; + i += 11) { + Crc crc_old = this->CrcByte(buf, n, 0); + Crc crc_new = this->CrcByte(buf, n, static_cast(i)); + Crc crc_chg = this->Base().ChangeStartValue(crc_old, n, 0, + static_cast(i)); + CHECK_EQ(crc_new, crc_chg); + } + } + } + + void VerifyConcatenate() const { +#if defined(_MSC_FULL_VER) && _MSC_FULL_VER <= 150030729 && defined(_M_IX86) + // Work around a bug in CL + if (sizeof(Crc) > 8) { + return; + } +#endif + uint8 buf[256]; + BobJenkinsRng rng; + for (size_t i = 0; i < 256; ++i) { + buf[i] = static_cast(rng.Get()); + } + for (size_t n = 1; n < 256; ++n) { + for (size_t i = 0; i < n; ++i) { + if (((i + 1) >> this->Base().Degree()) != 0) { + break; + } + Crc startA = static_cast(i + 1); + Crc crc_A = this->CrcByte(buf, i, startA); + Crc crc_B = this->CrcByte(buf + i, n - i, 0); + Crc crc_AB = this->CrcByte(buf, n, startA); + Crc crc = this->Base().Concatenate(crc_A, crc_B, n - i); + CHECK_EQ(crc_AB, crc); + } + } + } + + void VerifyCb(CrcCallback cb, const char *test_name) const { + uint8 buf[256]; + + fprintf(stderr, " %s\n", test_name); + fflush(stderr); + + // See whether it handles 0 bytes correctly. + (this->*cb)(NULL, 0, 0); + + BobJenkinsRng rng; + + for (size_t n = 0; n < 256; ++n) { + memset(buf, 0, sizeof(buf)); + + // Check "lonely 1" pattern. + for (size_t k = 0; k < n; ++k) { + buf[k] = 0x80; + Crc crc_old = this->CrcByte(buf, n, 0); + Crc crc_new = (this->*cb)(buf, n, 0); + CHECK_EQ(crc_old, crc_new); + buf[k] = 0; + } + + // Check "lonely random byte" pattern. + for (size_t k = 0; k < n; ++k) { + buf[k] = static_cast(rng.Get()); + Crc crc_old = this->CrcByte(buf, n, 0); + Crc crc_new = (this->*cb)(buf, n, 0); + CHECK_EQ(crc_old, crc_new); + buf[k] = 0; + } + + // Check "starts from sequence of 1s" pattern. + for (size_t k = 0; k < n; ++k) { + buf[k] = 0x80; + Crc crc_old = this->CrcByte(buf, n, 0); + Crc crc_new = (this->*cb)(buf, n, 0); + CHECK_EQ(crc_old, crc_new); + } + + // Check "starts from sequence of random bytes" pattern. + memset(buf, 0, sizeof(buf)); + for (size_t k = 0; k < n; ++k) { + buf[k] = static_cast(rng.Get()); + Crc crc_old = this->CrcByte(buf, n, 0); + Crc crc_new = (this->*cb)(buf, n, 0); + CHECK_EQ(crc_old, crc_new); + } + } + + // Check that alignment is handled correctly. + for (size_t n = 0; n < 256; ++n) { + buf[n] = static_cast(rng.Get()); + for (size_t k = 0; k < n; ++k) { + Crc crc_old = this->CrcByte(buf + k, n - k, 0); + Crc crc_new = (this->*cb)(buf + k, n - k, 0); + CHECK_EQ(crc_old, crc_new); + } + } + + // Now, do randomized tests. + size_t buffer_size = 128 * 1024; + uint8 *buffer = new uint8[buffer_size]; + + for (size_t i = 0; i < buffer_size; ++i) { + buffer[i] = static_cast(rng.Get()); + } + + for (size_t i = 0; i < 1 * 1000; ++i) { + size_t bytes = rng.Get() % (buffer_size - 1); + size_t offset = rng.Get() % (buffer_size - bytes); + Crc crc_old = this->CrcByte(buffer + offset, bytes, 0); + Crc crc_new = (this->*cb)(buffer + offset, bytes, 0); + CHECK_EQ(crc_old, crc_new); + } + + delete[] buffer; + } + + void VerifyLCD() const { + Crc A; + Crc B; + Crc LCD; + for (A = this->Base().One(); A != 0; A >>= 1) { + LCD = this->Base().FindLCD(A, &B); + CHECK_EQ(this->Base().One(), LCD); + Crc product = this->Base().Multiply(A, B); + CHECK_EQ(this->Base().One(), product); + } + + int rept = 253; + uint64 step = static_cast(1); + size_t degree = this->Base().Degree(); + if (degree > 64) degree = 62; + step = (step << degree) / rept; + uint64 value = step; + for (; --rept; value += step) { + A = static_cast(value); + LCD = this->Base().FindLCD(A, &B); + if (LCD == this->Base().One()) { + Crc product = this->Base().Multiply(A, B); + CHECK_EQ(this->Base().One(), product); + } + + uint8 buf[64]; + size_t bytes = this->Base().StoreCrc(buf, A); + Crc result = this->CrcByte(buf, bytes, A); + CHECK_EQ(this->Base().CrcOfCrc(), result); + + bytes = this->Base().StoreComplementaryCrc(buf, A, 0); + result = this->CrcByte(buf, bytes, A); + CHECK_EQ(result, 0); + } + } + + void VerifyCrcOfCrc(void) const { + Crc A; + int rept = 253; + uint64 step = static_cast(1); + size_t degree = this->Base().Degree(); + if (degree > 64) degree = 62; + step = (step << degree) / rept; + Crc expected = this->Base().CrcOfCrc(); + uint64 value = step; + for (; --rept; value += step) { + A = static_cast(value); + Crc value = this->CrcByte(&A, (this->Base().Degree() + 7) >> 3, A); + CHECK_EQ(expected, value); + } + } + + void VerifyDistribution() const { + Crc coef = this->Base().One(); + for (int index = 0; coef != 0; ++index, coef >>= 1) { + int ones = 0; + for (int i = 0; i < 256; ++i) { + if ((this->crc_word_[sizeof(Word) - 1][i] & coef) == 0) { + ones += 1; + } + } + CHECK_EQ(128, ones); + } + } + + void VerifyRollingCrc() const { + void *aligned_memory = AlignedAlloc(sizeof(RollingCrcSelf), 0, 256, NULL); + RollingCrcSelf *rolling_crc = new(aligned_memory) RollingCrcSelf; + + static const size_t kMaxRollBytes = 8; + static const size_t kBufferSize = 256 + kMaxRollBytes; + uint8 buffer[kBufferSize]; + + for (size_t starting_value = 0; + starting_value < 256 && + (starting_value >> this->Base().Degree()) == 0; + ++starting_value) { + for (size_t roll_bytes = 1; + roll_bytes < kMaxRollBytes; + ++roll_bytes) { + rolling_crc->Init(*this, roll_bytes, static_cast(starting_value)); + + memset(buffer, 0, sizeof(buffer)); + Crc old_crc = rolling_crc->Start(buffer); + for (size_t offset = roll_bytes; offset < kBufferSize; ++offset) { + Crc new_crc = rolling_crc->Roll(old_crc, + buffer[offset - roll_bytes], + buffer[offset]); + Crc vfy_crc = this->CrcByte(buffer + offset - roll_bytes + 1, + roll_bytes, + static_cast(starting_value)); + CHECK_EQ(new_crc, vfy_crc); + } + for (size_t offset = roll_bytes; offset < kBufferSize; ++offset) { + buffer[offset] = static_cast(offset); + Crc new_crc = rolling_crc->Roll(old_crc, + buffer[offset - roll_bytes], + buffer[offset]); + Crc vfy_crc = this->CrcByte(buffer + offset - roll_bytes + 1, + roll_bytes, + static_cast(starting_value)); + CHECK_EQ(new_crc, vfy_crc); + old_crc = new_crc; + } + } + } + + AlignedFree(aligned_memory); + } + + virtual void TestFunctionality(const char *class_title) const { + fprintf(stderr, + "Functional test of %s (size=%u bytes", + class_title, + static_cast( + sizeof(GenericCrc))); + if (this->HaveCrc32c()) { + fprintf(stderr, " [generic], %u bytes [CRC32C]", + static_cast(sizeof(Crc32cSSE4))); + } + fprintf(stderr, ")\n"); + fflush(stderr); + + VerifyPow(); + + VerifyCb(&CrcTestSelf::CrcByteUnrolled, "ByteUnrolled"); + VerifyCb(&CrcTestSelf::CrcByteWord, "ByteWord"); + VerifyCb(&CrcTestSelf::CrcWord, "Word"); + VerifyCb(&CrcTestSelf::CrcBlockword, "Blockword"); + VerifyCb(&CrcTestSelf::CrcMultiword, "Multiword"); + if (this->HaveCrc32c()) { + VerifyCb(&CrcTestSelf::CRC32C, "CRC32C"); + } + + VerifyLCD(); + VerifyCrcZeroes(); + VerifyChangeStartValue(); + VerifyConcatenate(); + VerifyCrcOfCrc(); + VerifyDistribution(); + + VerifyRollingCrc(); + + fprintf(stderr, "\n"); + fflush(stderr); + } + + // MemSpeed sets the lowest threshold: it is necessary to touch + // CRC table at least once per input byte -- and it is necessary + // to touch all input bytes. + Crc MemSpeed(const void *data, size_t bytes, const Crc &start) const { + const uint8 *src = static_cast(data); + const uint8 *end = src + bytes; + Crc crc0 = start ^ this->Base().Canonize(); + size_t buf0 = 0; + + end -= 4 * sizeof(Word) - 1; + if (src < end) { + Crc crc1 = 0; + Crc crc2 = 0; + Crc crc3 = 0; + do { + for (size_t byte = 0; byte < sizeof(Word); ++byte) { + crc0 ^= this->crc_word_interleaved_[0][0 * 64]; + crc1 ^= this->crc_word_interleaved_[1][1 * 64]; + crc2 ^= this->crc_word_interleaved_[2][2 * 64]; + crc3 ^= this->crc_word_interleaved_[3][3 * 64]; + buf0 ^= src[byte * sizeof(Word)]; + } + src += 4 * sizeof(Word); + } while (src < end); + crc0 ^= crc1 ^ crc2 ^ crc3; + } + end += 4 * sizeof(Word) - 1; + + end -= sizeof(Word) - 1; + while (src < end) { + buf0 ^= *src; + src += sizeof(Word); + for (size_t byte = 0; byte < sizeof(Word); ++byte) { + crc0 ^= this->crc_word_interleaved_[0][0]; + } + } + end += sizeof(Word) - 1; + + while (src < end) { + buf0 ^= *src; + src += 1; + crc0 ^= this->crc_word_interleaved_[0][0]; + } + + return (crc0 ^ static_cast(buf0)); + } + + void PerfTestCall(const uint8 *buf, size_t bytes, size_t rept, + CrcCallback cb, const Crc &expected_crc) const { + for (size_t r = 0; r < rept; ++r) { + Crc crc = (this->*cb)(buf, bytes, 0); + if (cb != &CrcTestSelf::MemSpeed) { + CHECK_EQ(expected_crc, crc); + } + } + } + + uint64 PerfTestMeasure(const uint8 *buf, size_t bytes, size_t rept, + size_t tries, CrcCallback cb, const Crc &expected_crc) const { + uint64 min_time = ~0ULL; + for (size_t i = 0; i < tries; ++i) { + uint64 t = Rdtsc::Get(); + PerfTestCall(buf, bytes, rept, cb, expected_crc); + t = Rdtsc::Get() - t; + if (min_time > t) { + min_time = t; + } + } + return min_time; + } + + static const char *CompilerName() { +#define EXPANDED_STRINGIZE(c) #c +#define STRINGIZE(c) EXPANDED_STRINGIZE(c) +#if defined(__GNUC__) + return "GCC-" STRINGIZE(__GNUC__) "." STRINGIZE(__GNUC_MINOR__) "." + STRINGIZE(__GNUC_PATCHLEVEL__); +#elif defined(__INTEL_COMPILER) + return "ICL-" STRINGIZE(__INTEL_COMPILER); +#elif defined(_MSC_FULL_VER) + return "CL-" STRINGIZE(_MSC_FULL_VER); +#else + return "Unknown"; +#endif +#undef EXPANDED_STRINGIZE +#undef STRINGIZE + } + + void PerfTest(PerfTestState *state, + const uint8 *buf, uint32 bytes, + CrcCallback cb, const char *title) const { + Crc expected_crc = this->CrcByte(buf, bytes, 0); + size_t tries = (64 * 1024 * 1024 + bytes - 1) / bytes; + if (tries < 20) { + tries = 20; + } else if (tries > 1000) { + tries = 1000; + } + size_t rept = (128 * 1024 * 1024 + tries*bytes - 1) / (tries*bytes); + if (rept > 10000) { + rept = 10000; + } + uint64 min_time = PerfTestMeasure(buf, bytes, rept, tries, cb, + expected_crc); + state->Add(bytes, title, min_time / (static_cast(rept) * bytes)); + fflush(stderr); + } + + uint64 PerfTestMeasureInit() { + uint64 min_time = 0; + min_time = ~min_time; + for (size_t i = 0; i < 5; ++i) { + uint64 t = Rdtsc::Get(); + this->InitWithCrc32c(this->Base().GeneratingPolynomial(), + this->Base().Degree(), + this->Base().Canonize() != 0); + t = Rdtsc::Get() - t; + if (min_time > t) { + min_time = t; + } + } + return min_time; + } + + void PerfTestVariants(PerfTestState *state, + bool test_multiword_only, + const uint8 *buf, uint32 buf_bytes, + uint32 bytes) const { + if (bytes > buf_bytes) { + return; + } + if (!test_multiword_only) { + PerfTest(state, buf, bytes, + &CrcTestSelf::MemSpeed, "MemSpeed"); + PerfTest(state, buf, bytes, + &CrcTestSelf::CrcByte, "Byte"); + PerfTest(state, buf, bytes, + &CrcTestSelf::CrcByteUnrolled, "ByteUnrolled"); + PerfTest(state, buf, bytes, + &CrcTestSelf::CrcByteWord, "ByteWord"); + PerfTest(state, buf, bytes, + &CrcTestSelf::CrcWord, "Word"); + } + PerfTest(state, buf, bytes, + &CrcTestSelf::CrcBlockword, "Blockword"); + PerfTest(state, buf, bytes, + &CrcTestSelf::CrcMultiword, "Multiword"); + if (this->HaveCrc32c()) { + PerfTest(state, buf, bytes, + &CrcTestSelf::CRC32C, "CRC32C"); + } + state->Print(); + } + + void PerfTestRun(FILE *output, + PerfTestState *state, + bool multiword_only, + uint8 *buf, + int align, + uint32 buf_bytes) { + BobJenkinsRng rng; + for (size_t i = 0; i < buf_bytes; ++i) { + buf[i] = static_cast(rng.Get()); + } + + fprintf(output, "ClassTitle, %s\n", class_title_); + fprintf(output, + "%12s, %7s, %6s, %3s, %11s, %4s, %6s, %9s, %10s, %10s\n", + "Compiler", + "CpuBits", + "Degree", + "Crc", + "TableEntry", + "Word", + "Stride", + "Alignment", + "TableBytes", + "InitCycles"); + fprintf(output, + "%12s, %7d, %6d, %3d, %11d, %4d, %6d, %9d, %10d, %10d\n", + CompilerName(), + static_cast(sizeof(size_t) * 8), + static_cast(this->Base().Degree()), + static_cast(sizeof(Crc)), + static_cast(sizeof(TableEntry)), + static_cast(sizeof(Word)), + static_cast(kStride), + static_cast(align), + static_cast(sizeof(CrcTestSelf)), + static_cast(PerfTestMeasureInit())); + fprintf(output, "\n"); + fflush(output); + + state->StartNewCrc(class_title_); + + for (uint32 i = 4; i <= 64 * 1024 * 1024; i *= 2) { + PerfTestVariants(state, multiword_only, buf, buf_bytes, i); + } + state->Finish(); + +#if defined(FULL_PERF_TEST) + // Needed for performance work only. + for (uint32 i = 1; i <= 128; ++i) { + PerfTestVariants(state, multiword_only, buf, buf_bytes, i); + } + state->Finish(); +#endif // defined(FULL_PERF_TEST) + } + + void TestPerformance(FILE *output, + PerfTestState *state, + bool multiword_only, + const char *class_title) { + class_title_ = class_title; + uint32 align = sizeof(Word); + uint32 buf_bytes = 64*1024*1024; + uint8 *buf0 = new uint8[buf_bytes + align*2]; + uint8 *buf = buf0; + + if ((reinterpret_cast(buf) & (align - 1)) != 0) { + buf += align - (reinterpret_cast(buf) & (align - 1)); + } + + PerfTestRun(output, state, multiword_only, buf, 0, buf_bytes); + +#if defined(FULL_PERF_TEST) + // Needed for performance work only. + PerfTestRun(output, + state, + multiword_only, + buf + sizeof(Word)/2, + sizeof(Word)/2, + buf_bytes); +#endif // defined(FULL_PERF_TEST) + + delete[] buf; + } + + private: + const char *class_title_; +}; + +class CrcVerifierFactoryInterface { + public: + virtual CrcVerifierInterface *Create(void *memory) const = 0; + virtual size_t TellMemoryBytesNeeded() const = 0; + virtual const char *class_title() const = 0; + virtual bool test_performance() const = 0; + virtual bool multiword_only() const = 0; + CrcVerifierFactoryInterface() {} + virtual ~CrcVerifierFactoryInterface() {} +}; + +// Verifies functionality of all registered CRCs first +// and only then runs time-consuming performance tests. +// That is helpful during development: we do not want to wait for +// all performance tests to go through but still want to do full +// functionality test. +class CrcVerifier { + public: + CrcVerifier() : memory_needed_(0), factory_count_(0) {} + + void add(const CrcVerifierFactoryInterface *factory) { + if (factory_count_ < MAX_FACTORY_COUNT) { + factory_[factory_count_] = factory; + factory_count_ += 1; + size_t memory_needed = factory->TellMemoryBytesNeeded(); + if (memory_needed_ < memory_needed) { + memory_needed_ = memory_needed; + } + } + } + + void TestFunctionality() { + fprintf(stderr, "Verifying functionality\n"); + fflush(stderr); + + memory_allocate(); + for (size_t i = 0; i < factory_count_; ++i) { + const CrcVerifierFactoryInterface *factory = factory_[i]; + const CrcVerifierInterface *instance = factory->Create(aligned_memory_); + instance->TestFunctionality(factory->class_title()); + } + memory_release(); + } + + void TestPerformance() { + fprintf(stderr, "Verifying performance\n"); + fflush(stderr); + + FILE *output = stdout; + PerfTestState state(output); + + memory_allocate(); + for (size_t i = 0; i < factory_count_; ++i) { + const CrcVerifierFactoryInterface *factory = factory_[i]; + if (!factory->test_performance()) { + continue; + } + CrcVerifierInterface *instance = factory->Create(aligned_memory_); + instance->TestPerformance(output, + &state, + factory->multiword_only(), + factory->class_title()); + } + + state.PrintBest(); + + memory_release(); + } + + ~CrcVerifier() { + for (size_t i = 0; i < factory_count_; ++i) { + delete factory_[i]; + } + } + + + private: + void memory_allocate() { + aligned_memory_ = AlignedAlloc(memory_needed_, 0, 256, NULL); + } + + void memory_release() { + AlignedFree(aligned_memory_); + } + + enum { + MAX_FACTORY_COUNT = 100, + }; + void *aligned_memory_; + size_t memory_needed_; + size_t factory_count_; + const CrcVerifierFactoryInterface *factory_[MAX_FACTORY_COUNT]; +}; + +// Provides a factory creating ins +// +template + class CrcVerifierFactory : public CrcVerifierFactoryInterface { + public: + typedef CrcTest CrcTestSelf; + typedef CrcVerifierFactory + CrcVerifierFactorySelf; + + CrcVerifierFactory(bool constant, size_t degree, + uint64 poly_hi, uint64 poly_lo, + const char *class_title, + bool test_performance, + bool multiword_only) + : degree_(degree), + constant_(constant), + test_performance_(test_performance), + multiword_only_(multiword_only) { + strcpy(class_title_, class_title); + + // On 32-bit platforms, "this" may be misaligned with respect + // to sizeof(Crc) -- even though alignment of the structure is + // correct (e.g. 16 when Crc=uint128_sse2), "new" returns memory + // that is aligned on 8 boundary only. Respectively, attempt + // to access a field of Crc type when Crc=uint128_sse2 fails. + // + // Use local variable and memcpy to access fields of Crc type. + // + Crc generating_polynomial = CrcFromUint64(poly_lo, poly_hi); + memcpy(&generating_polynomial_, &generating_polynomial, sizeof(Crc)); + } + + virtual CrcVerifierInterface *Create(void *memory) const { + CrcTestSelf *crc = new(memory) CrcTestSelf; + // "this" may be misaligned on 32-bit platforms. + // Use local variable and memcpy to access fields of Crc type. + Crc generating_polynomial; + memcpy(&generating_polynomial, &generating_polynomial_, sizeof(Crc)); + crc->InitWithCrc32c(generating_polynomial, degree_, constant_); + return crc; + } + + virtual size_t TellMemoryBytesNeeded() const { + return sizeof(CrcTestSelf); + } + + const char *class_title() const { return class_title_; } + bool test_performance() const { return test_performance_; } + bool multiword_only() const { return multiword_only_; } + + private: + CrcVerifierFactory() {} + const CrcVerifierFactory &operator=(const CrcVerifierFactory &src); + + Crc generating_polynomial_; + char class_title_[128]; + size_t const degree_; + bool const constant_; + bool const test_performance_; + bool const multiword_only_; +}; + +// Adds 2 tests to the verifier: one full test with 4 stripes, +// and one reduced test (only Blockword and Multiword) for 3 stripes. +template + void CreateTest(size_t degree, + uint64 poly_hi, + uint64 poly_lo, + const char *title, + bool test_performance, + CrcVerifier *v) { + char name[128]; + bool canonical = true; + for (;;) { + sprintf(name, "CRC-%d-%s-4-%s", static_cast(degree), + title, (canonical ? "canonical" : "raw")); + v->add(new CrcVerifierFactory(canonical, + degree, + poly_hi, + poly_lo, + name, + test_performance, + false)); + + if (degree == 128 && HAVE_AMD64) { + sprintf(name, "CRC-%d-%s-6-%s", static_cast(degree), + title, (canonical ? "canonical" : "raw")); + v->add(new CrcVerifierFactory(canonical, + degree, + poly_hi, + poly_lo, + name, + test_performance, + true)); + } + + sprintf(name, "CRC-%d-%s-3-%s", static_cast(degree), + title, (canonical ? "canonical" : "raw")); + v->add(new CrcVerifierFactory(canonical, + degree, + poly_hi, + poly_lo, + name, + test_performance, + true)); + if (!canonical) { + break; + } + canonical = false; + test_performance = false; + } +} + +#if defined(_INTEL_COMPILER) +#pragma warning(pop) +#endif // defined(_INTEL_COMPILER) + +} // namespace crcutil + +#endif // CRCUTIL_UNITTEST_H_ diff --git a/crcutil-1.0/tests/unittest_helper.h b/crcutil-1.0/tests/unittest_helper.h new file mode 100644 index 0000000..a4b1ac6 --- /dev/null +++ b/crcutil-1.0/tests/unittest_helper.h @@ -0,0 +1,45 @@ +// Copyright 2010 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// A set of useful macros for crcutil_unittest. + +#ifndef CRCUTIL_UNITTEST_HELPER_H_ +#define CRCUTIL_UNITTEST_HELPER_H_ + +#include "std_headers.h" // printf + +#if !defined(CHECK) + +#if defined(_MSC_VER) +#define DEBUG_BREAK() __debugbreak() +#else +#define DEBUG_BREAK() exit(1) +#endif // defined(_MSC_VER) + +#define CHECK(cond) do { \ + if (!(cond)) { \ + fprintf(stderr, "%s, %d: ASSERT(%s)\n", __FILE__, __LINE__, #cond); \ + fflush(stderr); \ + DEBUG_BREAK(); \ + } \ +} while (0) + + +#define CHECK_GE(a, b) CHECK((a) >= (b)) +#define CHECK_NE(a, b) CHECK((a) != (b)) +#define CHECK_EQ(a, b) CHECK((a) == (b)) + +#endif // !defined(CHECK) + +#endif // CRCUTIL_UNITTEST_HELPER_H_ diff --git a/findcrcs.cc b/findcrcs.cc new file mode 100644 index 0000000..5c7c12a --- /dev/null +++ b/findcrcs.cc @@ -0,0 +1,147 @@ +/* + Copyright 2013, V. + + This file is part of findcrcs. + + findcrcs 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 3 of the License, or + (at your option) any later version. + + findcrcs 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 findcrcs. If not, see . +*/ + +/* + findcrcs is using crcutil-1.0 for providing fast crc calculations + crcutil is made by Andrew Kadatch and Bob Jenkins and can be found on http://code.google.com/p/crcutil/ + Do not contact them for support on findcrcs + + Also, findcrcs makes use of the MD5 implementation of Alexander Peslyak. + This is found at http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + A small casting patch was made to support g++. + This patch is released under the same license as the original md5.c file. +*/ + +// Usage: findcrcs [more crcs...] +// not yet idiotproof +// code comments also not included (yet, if ever) + +#include +#include +#include +#include +#include +#include +#include +#include "md5.h" +#include "interface.h" + +#ifndef O_BINARY +#define O_BINARY 0 +#endif + +#define BUFFERSIZE 65536 +#define MD5_DIGEST_LENGTH 16 + +void checkcrcs(unsigned int crc, unsigned int crcs[], int totalcrcs, int fd, int offset, int windowsize); + +int main(int argc, char *argv[]) { + int i1, i2, fd1, fd2, fd3, filesize, windowsize, readbytes; + char *filename; + crcutil_interface::CRC *crc; + unsigned long long returnvalue; + unsigned char buffer1[BUFFERSIZE], buffer2[BUFFERSIZE]; + struct stat stats; + unsigned int crcs[argc - 3]; + + if (argc < 4) { + fprintf(stderr, "usage: findcrcs [more crcs...]\n"); + return 1; + } + + filename = argv[1]; + if (stat(filename, &stats) == -1) { + perror("findcrcs"); + return 1; + } + filesize = stats.st_size; + + windowsize = atoi(argv[2]); + if (windowsize > filesize) { + fprintf(stderr, "findcrcs: window size too big\n"); + return 1; + } + + for (i1 = 0; i1 < argc - 3; i1++) { + crcs[i1] = (unsigned int)strtoul(argv[i1 + 3], 0, 16); + } + + crc = crcutil_interface::CRC::Create(0xedb88320, 0, 32, true, 0, 0, windowsize, 0, NULL); + + fd1 = open(filename, O_RDONLY | O_BINARY); + fd2 = open(filename, O_RDONLY | O_BINARY); + fd3 = open(filename, O_RDONLY | O_BINARY); + + returnvalue = 0; + for (i1 = 0; i1 < windowsize / BUFFERSIZE; i1++) { + read(fd1, &buffer1, BUFFERSIZE); + crc->Compute(&buffer1, BUFFERSIZE, &returnvalue); + } + if ((windowsize % BUFFERSIZE) != 0) { + read(fd1, &buffer1, (windowsize % BUFFERSIZE)); + crc->Compute(&buffer1, (windowsize % BUFFERSIZE), &returnvalue); + } + checkcrcs((unsigned int)returnvalue, crcs, argc - 3, fd3, 0, windowsize); + + for (i1 = 0; i1 < ((filesize - windowsize) / BUFFERSIZE) + 1; i1++) { + readbytes = read(fd1, &buffer1, BUFFERSIZE); + read(fd2, &buffer2, BUFFERSIZE); + for (i2 = 0; i2 < readbytes; i2++) { + crc->Roll(buffer2[i2], buffer1[i2], &returnvalue, NULL); + checkcrcs((unsigned int)returnvalue, crcs, argc - 3, fd3, (i1 * BUFFERSIZE) + i2 + 1, windowsize); + } + } + + close(fd3); + close(fd2); + close(fd1); + crc->Delete(); + return 0; +} + +void checkcrcs(unsigned int crc, unsigned int crcs[], int totalcrcs, int fd, int offset, int windowsize) { + int i1, i2; + unsigned int buffer[BUFFERSIZE]; + unsigned char md5[MD5_DIGEST_LENGTH]; + MD5_CTX ctx; + + for (i1 = 0; i1 < totalcrcs; i1++) { + if (crc == crcs[i1]) { + lseek(fd, offset, SEEK_SET); + MD5_Init(&ctx); + + for (i2 = 0; i2 < windowsize / BUFFERSIZE; i2++) { + read(fd, &buffer, BUFFERSIZE); + MD5_Update(&ctx, &buffer, BUFFERSIZE); + } + if ((windowsize % BUFFERSIZE) != 0) { + read(fd, &buffer, (windowsize % BUFFERSIZE)); + MD5_Update(&ctx, &buffer, (windowsize % BUFFERSIZE)); + } + + MD5_Final(md5, &ctx); + printf("%d %08x ", offset, crc); + for (i2 = 0; i2 < MD5_DIGEST_LENGTH; i2++) { + printf("%02x", md5[i2]); + } + printf("\n"); + return; + } + } +} diff --git a/md5.c b/md5.c new file mode 100644 index 0000000..2f01c93 --- /dev/null +++ b/md5.c @@ -0,0 +1,295 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * (This is a heavily cut-down "BSD license".) + * + * This differs from Colin Plumb's older public domain implementation in that + * no exactly 32-bit integer data type is required (any 32-bit or wider + * unsigned integer data type will do), there's no compile-time endianness + * configuration, and the function prototypes match OpenSSL's. No code from + * Colin Plumb's implementation has been reused; this comment merely compares + * the properties of the two independent implementations. + * + * The primary goals of this implementation are portability and ease of use. + * It is meant to be fast, but not as fast as possible. Some known + * optimizations are not included to reduce source code size and avoid + * compile-time configuration. + */ + +#ifndef HAVE_OPENSSL + +#include + +#include "md5.h" + +/* + * The basic MD5 functions. + * + * F and G are optimized compared to their RFC 1321 definitions for + * architectures that lack an AND-NOT instruction, just like in Colin Plumb's + * implementation. + */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | ~(z))) + +/* + * The MD5 transformation for all four rounds. + */ +#define STEP(f, a, b, c, d, x, t, s) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +/* + * SET reads 4 input bytes in little-endian byte order and stores them + * in a properly aligned word in host byte order. + * + * The check for little-endian architectures that tolerate unaligned + * memory accesses is just an optimization. Nothing will break if it + * doesn't work. + */ +#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) +#define SET(n) \ + (*(MD5_u32plus *)&ptr[(n) * 4]) +#define GET(n) \ + SET(n) +#else +#define SET(n) \ + (ctx->block[(n)] = \ + (MD5_u32plus)ptr[(n) * 4] | \ + ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ + ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ + ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) +#define GET(n) \ + (ctx->block[(n)]) +#endif + +/* + * This processes one or more 64-byte data blocks, but does NOT update + * the bit counters. There are no alignment requirements. + */ +static void *body(MD5_CTX *ctx, void *data, unsigned long size) +{ + unsigned char *ptr; + MD5_u32plus a, b, c, d; + MD5_u32plus saved_a, saved_b, saved_c, saved_d; + + ptr = (unsigned char *)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + +/* Round 1 */ + STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) + STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) + STEP(F, c, d, a, b, SET(2), 0x242070db, 17) + STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22) + STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7) + STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12) + STEP(F, c, d, a, b, SET(6), 0xa8304613, 17) + STEP(F, b, c, d, a, SET(7), 0xfd469501, 22) + STEP(F, a, b, c, d, SET(8), 0x698098d8, 7) + STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12) + STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17) + STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22) + STEP(F, a, b, c, d, SET(12), 0x6b901122, 7) + STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) + STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) + STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) + +/* Round 2 */ + STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) + STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) + STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) + STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) + STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) + STEP(G, d, a, b, c, GET(10), 0x02441453, 9) + STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) + STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) + STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) + STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) + STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) + STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) + STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) + STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) + STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) + STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) + +/* Round 3 */ + STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) + STEP(H, d, a, b, c, GET(8), 0x8771f681, 11) + STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) + STEP(H, b, c, d, a, GET(14), 0xfde5380c, 23) + STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) + STEP(H, d, a, b, c, GET(4), 0x4bdecfa9, 11) + STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) + STEP(H, b, c, d, a, GET(10), 0xbebfbc70, 23) + STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) + STEP(H, d, a, b, c, GET(0), 0xeaa127fa, 11) + STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) + STEP(H, b, c, d, a, GET(6), 0x04881d05, 23) + STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) + STEP(H, d, a, b, c, GET(12), 0xe6db99e5, 11) + STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) + STEP(H, b, c, d, a, GET(2), 0xc4ac5665, 23) + +/* Round 4 */ + STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) + STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) + STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) + STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) + STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) + STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) + STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) + STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) + STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) + STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) + STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) + STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) + STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) + STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) + STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) + STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while (size -= 64); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +void MD5_Init(MD5_CTX *ctx) +{ + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + + ctx->lo = 0; + ctx->hi = 0; +} + +void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size) +{ + MD5_u32plus saved_lo; + unsigned long used, free; + + saved_lo = ctx->lo; + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) + ctx->hi++; + ctx->hi += size >> 29; + + used = saved_lo & 0x3f; + + if (used) { + free = 64 - used; + + if (size < free) { + memcpy(&ctx->buffer[used], data, size); + return; + } + + memcpy(&ctx->buffer[used], data, free); + data = (unsigned char *)data + free; + size -= free; + body(ctx, ctx->buffer, 64); + } + + if (size >= 64) { + data = body(ctx, data, size & ~(unsigned long)0x3f); + size &= 0x3f; + } + + memcpy(ctx->buffer, data, size); +} + +void MD5_Final(unsigned char *result, MD5_CTX *ctx) +{ + unsigned long used, free; + + used = ctx->lo & 0x3f; + + ctx->buffer[used++] = 0x80; + + free = 64 - used; + + if (free < 8) { + memset(&ctx->buffer[used], 0, free); + body(ctx, ctx->buffer, 64); + used = 0; + free = 64; + } + + memset(&ctx->buffer[used], 0, free - 8); + + ctx->lo <<= 3; + ctx->buffer[56] = ctx->lo; + ctx->buffer[57] = ctx->lo >> 8; + ctx->buffer[58] = ctx->lo >> 16; + ctx->buffer[59] = ctx->lo >> 24; + ctx->buffer[60] = ctx->hi; + ctx->buffer[61] = ctx->hi >> 8; + ctx->buffer[62] = ctx->hi >> 16; + ctx->buffer[63] = ctx->hi >> 24; + + body(ctx, ctx->buffer, 64); + + result[0] = ctx->a; + result[1] = ctx->a >> 8; + result[2] = ctx->a >> 16; + result[3] = ctx->a >> 24; + result[4] = ctx->b; + result[5] = ctx->b >> 8; + result[6] = ctx->b >> 16; + result[7] = ctx->b >> 24; + result[8] = ctx->c; + result[9] = ctx->c >> 8; + result[10] = ctx->c >> 16; + result[11] = ctx->c >> 24; + result[12] = ctx->d; + result[13] = ctx->d >> 8; + result[14] = ctx->d >> 16; + result[15] = ctx->d >> 24; + + memset(ctx, 0, sizeof(*ctx)); +} + +#endif diff --git a/md5.h b/md5.h new file mode 100644 index 0000000..f1a6857 --- /dev/null +++ b/md5.h @@ -0,0 +1,45 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * See md5.c for more information. + */ + +#ifdef HAVE_OPENSSL +#include +#elif !defined(_MD5_H) +#define _MD5_H + +/* Any 32-bit or wider unsigned integer data type will do */ +typedef unsigned int MD5_u32plus; + +typedef struct { + MD5_u32plus lo, hi; + MD5_u32plus a, b, c, d; + unsigned char buffer[64]; + MD5_u32plus block[16]; +} MD5_CTX; + +extern void MD5_Init(MD5_CTX *ctx); +extern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size); +extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); + +#endif